Собственно такая штука.. таблица около 50к записей (будет больше). Запрос вида
SQL |
SELECT SQL_NO_CACHE `post_id` FROM `links_posts` ORDER BY `post_id` DESC LIMIT 0, 10 |
SQL |
SELECT SQL_NO_CACHE `post_id` FROM `links_posts` ORDER BY `post_id` DESC LIMIT 50000, 10 |
Цитата (kirik @ 16.09.2009 - 06:25) |
но все описанные варианты не совсем подходят |
Код |
Рассмотрим все на простом примере: пусть записи выдаются отсортированные по id. В этом случае нам нужно вместе со ссылкой передать id записи, на которой мы остановились. А остановимся мы на записи с id=10. То есть, в параметрах ссылки на следующую страницу нам нужно передать 10. Соответственно, для второй страницы запрос будет выглядеть так: SELECT SQL_NO_CACHE id FROM items WHERE id>10 ORDER BY id LIMIT 10; |
Цитата (kirik @ 16.09.2009 - 06:25) |
чего можно поделать с такими шутками. |
SQL |
SELECT * FROM ibf_posts ORDER BY pid ASC WHERE topic_id = 12345 LIMIT 150, 15 |
SQL |
SELECT * FROM ibf_posts ORDER BY pid ASC WHERE topic_id = 12345 LIMIT 0, 15 |
SQL |
SELECT * INTO OUTFILE 'ibf_posts.sql' FROM ibf_posts ORDER BY topic_id; TRUNKATE ibf_posts; LOAD DATA INFILE "ibf_posts.sql" INTO TABLE ibf_posts; |
SQL |
SELECT * INTO OUTFILE 'ibf_posts.sql' FROM ibf_posts ORDER BY topic_id; TRUNKATE ibf_posts; LOAD DATA INFILE "ibf_posts.sql" INTO TABLE ibf_posts; |
Цитата |
более - 80-95 секунд. |
Цитата |
Видимо в буфер не влезает и используется диск. explain что говорит? |
Цитата (Nikitian @ 16.09.2009 - 13:30) |
explain что говорит? |
SQL |
select * from handovers order by date_, lac, cellid limit 5 offset 463375 |
Код |
offset 463374 "Limit (cost=1364547.00..1364561.73 rows=5 width=36) (actual time=1860.456..1860.474 rows=5 loops=1)" " -> Index Scan using date_handovers on handovers (cost=0.00..18814162.89 rows=6388929 width=36) (actual time=0.183..1222.032 rows=463379 loops=1)" "Total runtime: 1860.576 ms" offset 463375 "Limit (cost=1364563.87..1364563.89 rows=5 width=36) (actual time=106573.340..106573.358 rows=5 loops=1)" " -> Sort (cost=1363405.44..1379377.76 rows=6388929 width=36) (actual time=104816.103..105962.603 rows=463380 loops=1)" " Sort Key: date_, lac, cellid" " Sort Method: external merge Disk: 324632kB" " -> Seq Scan on handovers (cost=0.00..117131.29 rows=6388929 width=36) (actual time=0.025..10274.524 rows=6388929 loops=1)" "Total runtime: 106601.495 ms" |
Цитата (glock18 @ 16.09.2009 - 12:50) |
а optimize table не дал бы тот же эффект? |
Цитата (FatCat @ 16.09.2009 - 14:59) | ||
Нет конечно, он только пэки поубивает, но не оптимизирует физическую структуру данных в файле таблицы. Обращение к БД - это в том числе и чтение из файла головкой винчестера по кластерам. Если данные разбросаны по разным кластерам, дополнительное время расходуется на считывание информации, потому и задержки. |
SQL |
SELECT * INTO OUTFILE 'ibf_posts.sql' FROM ibf_posts ORDER BY topic_id; TRUNKATE ibf_posts; LOAD DATA INFILE "ibf_posts.sql" INTO TABLE ibf_posts; |
Цитата (FatCat @ 16.09.2009 - 12:59) | ||
Нет конечно, он только пэки поубивает, но не оптимизирует физическую структуру данных в файле таблицы. Обращение к БД - это в том числе и чтение из файла головкой винчестера по кластерам. Если данные разбросаны по разным кластерам, дополнительное время расходуется на считывание информации, потому и задержки. |
Цитата |
Команда OPTIMIZE TABLE должна использоваться после удаления большей части таблицы или если в таблице было внесено много изменений в строки переменной длины (таблицы, в которых есть столбцы VARCHAR, BLOB или TEXT). Удаленные записи поддерживаются при помощи связного списка, и последующие операции INSERT повторно используют позиции старых записей. Чтобы перераспределить неиспользуемое пространство и дефрагментировать файл данных, можно воспользоваться командой OPTIMIZE TABLE. |
Цитата (waldicom @ 16.09.2009 - 17:09) |
Как на винте место будет, так операционная система их и распределит. |
Цитата (Nikitian @ 16.09.2009 - 17:25) |
Хм, а мануал говорит иначе: |
Цитата (glock18 @ 16.09.2009 - 02:04) |
Почему описанные варианты не подходят? |
Цитата (Nikitian @ 16.09.2009 - 02:26) |
Хотя я всё же рекомендую кешировать такие запросы, чтобы нагрузка не была роковой для машинки. |
Цитата (glock18 @ 16.09.2009 - 04:35) |
Стоит только запросом начать выбирать только id, а уже по ним всю информацию из таблицы - все начинает летать. |
Цитата (FatCat @ 16.09.2009 - 03:29) |
Решение нашлось в физическом структурировании данных. |
Цитата (kirik @ 16.09.2009 - 23:06) |
А когда например данные добавляются, но не изменяются (допустим какой-нибудь лог), это не спасет? |