|
|
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
Все привет. Почитал доку по использованию индекса при сортировке link . Но не могу понять почему в моем случае не используется индекс. Сам запрос довольно сложный с 5 left join, но даже упростив его к самому простому виду индекс все равно не используется. Вот упрощенный запрос и вывод explain: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. SQL на создание таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. когда указываю force index, то запрос выполняется в разы быстрее, но этто решение не подходитт так как сортировка может меняться пользователем с UI и ко всему может добавиться множество условий фильтрации. Пробовал как на маленьком кол-ве записей так и на 500 000, результат одинаковый. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 00:18:17 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
qtech, чет там много букв по ссылке. Сказали что не работает если 2 сорта из РАЗНЫХ индекса. У вас ласт-ферст -- части одного индекса, но на ферст-ласт есть и другой индекс, может это сбивает оптимизатор с толку. Попробуйте упростить ситуацию до одного сорта и одного индекса а потом добавляйте и смотрите где произойдет срыв. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 00:59:46 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
qtech, а если добавить limit 10? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 05:52:38 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
а если обратить внимание на ) ENGINE=InnoDB AUTO_INCREMENT=50 и вспомнить, что при малом количестве данных, чем читать индекс с шдд, и чтото делать, проще считать только данные, и отсортировать. загрузи данных 5000 строк хотябы, и если не будет использовать, ТОГДА будем думать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 12:26:24 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
alex564657498765453а если обратить внимание на ) ENGINE=InnoDB AUTO_INCREMENT=50Это верно, но ТС написал, чтоqtechПробовал как на маленьком кол-ве записей так и на 500 000, результат одинаковый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 12:35:26 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
авторУ вас ласт-ферст -- части одного индекса, но на ферст-ласт есть и другой индекс, может это сбивает оптимизатор с толку. неверно. он выбирает ВСЮ таблицу. читать всю по индексу никто не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 12:37:38 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторУ вас ласт-ферст -- части одного индекса, но на ферст-ласт есть и другой индекс, может это сбивает оптимизатор с толку. неверно. он выбирает ВСЮ таблицу. читать всю по индексу никто не будет. да поигрался на своей базе -мало много данных(две базы, одна рабочая, другая тестовая - идентичны, только в одной 20 юзеров и 20000 файлов, в другой 500 000 юзерово, и 1.4млрд файлов. таки да, похоже индекс используеться мусклом при сортировке, по типу -один чорт его надо использовать для выборки, или же при сортировке по нескольким полям(по разным индексам)... почитал статью по линке, и таки да...там в примерах когда индекс используеться, примеры именно из такого сериала. итого при запросе select * from table order by key - мускл походу чем читать индекс, а потом бегать по винчестеру в зад вперёд выискивать нужные записи, щитеат что лучше он будет блоками вычитывать записи как лежат, сортировать сам , сохранять сортированый блок во временый файл, и короче ...заниматься не хилым гемороем. вообще, я думаю вцелом оно оправдано... ибо запрос select * from table order by key - для таблицы с милиардом записей попахивает идиотизмом. если надо 10 записей(лимит задать) индекс будет использован. если выборка из колонок, которые входят в состав индекса(индекс_дата = индекс_поле1 +...+ индекс_полеН + первичный ключ ---для ИнноДБ) то вместо чтения данных таблицы будет вычитываться индекс, который уже упорядочен по нужному полю. остальные случаи использования индекса - это сортировка по двум "инддексам" - по одному будет вычитываться, второй как файлсорт или же секция веар должна использовать индекс тот, по которому хотим чтоб и сортировало. ===== таки да, человек прав - всю таблицу вычитывать по индексу мускл не будет...правда я не до конца уверен что понимаю почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 12:48:53 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
автор.правда я не до конца уверен что понимаю почему. потому что там в оптимизаторе зашито помоему 5% от все таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 13:03:52 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
ScareCrow, то ли 5, то ли 20, но в любом случае не вся. Почему я про лимит и спросил - мало ли, вдруг у ТСа вообще какой-то своеобразный глюк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 13:33:17 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
тоесть типо если считываем больше чем 20% таблицы, то читаем без индекса??? или как применяеться этот процент??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 14:07:02 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
tanglirScareCrow, то ли 5, то ли 20, но в любом случае не вся. Почему я про лимит и спросил - мало ли, вдруг у ТСа вообще какой-то своеобразный глюк. Мне один ДБА сказал что 5% -- один из стандартов в Оракле. Для МуСКЛа в интернете есть статейке где человек показал 20% для МуСКЛа. кроме того, 5-20% -- это все для чтения при наличии WHERE key (=><in..) value. Индекс для сортировки вроде отдельный вопрос. По ссылке есть примеры где индекс для сортировки вообше без WHERE. Также не совсем понятно как он (сортировочный индек) проявляется в ЕКСПЛЕЙН. Похоже не в посибле кейс и не в кейз, а только по наличию или точнее по отсутсвию filesort в ячейке extra. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 15:52:03 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
javajdbcТакже не совсем понятно как он (сортировочный индек) проявляется в ЕКСПЛЕЙН. Похоже не в посибле кейс и не в кейз, а только по наличию или точнее по отсутсвию filesort в ячейке extra. авторWith EXPLAIN SELECT ... ORDER BY, you can check whether MySQL can use indexes to resolve the query. It cannot if you see Using filesort in the Extra column. авторПо ссылке есть примеры где индекс для сортировки вообше без WHERE. авторas long as all of the unused portions of the index and all the extra ORDER BY columns are constants in the WHERE clause ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 16:13:34 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
ScareCrowjavajdbcТакже не совсем понятно как он (сортировочный индек) проявляется в ЕКСПЛЕЙН. Похоже не в посибле кейс и не в кейз, а только по наличию или точнее по отсутсвию filesort в ячейке extra. авторWith EXPLAIN SELECT ... ORDER BY, you can check whether MySQL can use indexes to resolve the query. It cannot if you see Using filesort in the Extra column. авторПо ссылке есть примеры где индекс для сортировки вообше без WHERE. авторas long as all of the unused portions of the index and all the extra ORDER BY columns are constants in the WHERE clause по ЕКСПЛЕЙНУ так и не понятно есть ли "позитивная" индикация использования индекса для сорта. Как мы видим, наличие filesort есть "негативная" индикация об отсутсвии использования сорт-индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 16:50:25 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
javajdbc, сорт индекс??? это огткуда?! я так понял, мускл как и видимо другие дб, затачиваються под выборки данных , а не под выгрузку данных или части. под словом выгрузка, я понимал значительные обьёмы что выгрузка производиться преимущественно в файл а выборка, это для человека, исходя из того, что человеку --- ну 20, ну 50 записей надо, больше никто перечитывать не будет. и если говорить о сортировке, то индекс будет использован если он либо будет использован всеравно, либо по данным индекса выбрать легче примеры table(id -PK,name INDEX, extra) select id,name from table order by name //use index,проще выбрать эти два поля из индекса -данные даже никчему читать select * from table order by name//no index select * from table where name > 'a' order by name //use index,потому что он уже будет использоваться, для выборки нужных значений---соответсвенно читая индекс(где все итак отсортировано по нейм, ...мы не сортируем по нейм, оно уже вычитываеться отсортировано по этому полю select * from table order by name limit 10//индекс используеться не для сортировки, а для оптимизации выборки... это как я понял из всего имеющегося материала плюс опыты, плюс попытка понять как думали разработчики. ---- итого мой вывод ввиду того, что индексы нужны для выборки данных, а сортировка это уже послеобработка (после выборки перед отдачей клиента) - то индексы и не используються при сортировке. возможна ситуации - когда сортировка не будет выполняться(файлсорт) ибо выборка будет уже в правильной последовательности - когда именно сортировка заставит использовать индекс по сортируемому полю, но это будет не первопричиной - первопричина - оптимизация самой выборки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 18:04:43 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
авторкогда именно сортировка заставит использовать индекс по сортируемому полю, но это будет не первопричиной - первопричина - оптимизация самой выборки. эпично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 18:09:51 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
javajdbc, Второй индекс(реверс) был добавлен позже, но и 1й не работал(в правильном порядке part1_part2) tanglir, Запросы с limit тоже не используют индекс alex564657498765453а если обратить внимание на и вспомнить, что при малом количестве данных, чем читать индекс с шдд, и чтото делать, проще считать только данные, и отсортировать. загрузи данных 5000 строк хотябы, и если не будет использовать, ТОГДА будем думать. Пробовали на базе 500 000+ как и писал в стартовом посте alex564657498765453select * from table order by name limit 10//индекс используеться не для сортировки, а для оптимизации выборки... как ответил выше насколько мне не изменяет память с лимитом тоже файл сорт. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 5 записей из 131 это меньше 5% не говоря о 20... Хотя мне кажется что этот процент прямо пропорционален sort_buffer_size ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 19:34:58 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
завтра проверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 21:55:03 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
ScareCrow, Большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 00:22:19 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
qtech5 записей из 131 это меньше 5%131 запись - это, я уверен на 146%, всего одно чтение с диска (только данные) а если читать индекс, а потом данные - это будут 2 чтения результаты на сотнях и тысячах записей не говорят вообще ни о чём ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 05:11:13 |
|
||
|
ORDER BY не использует индекс
|
|||
|---|---|---|---|
|
#18+
qtechjavajdbc, Второй индекс(реверс) был добавлен позже, но и 1й не работал(в правильном порядке part1_part2) tanglir, Запросы с limit тоже не используют индекс alex564657498765453а если обратить внимание на и вспомнить, что при малом количестве данных, чем читать индекс с шдд, и чтото делать, проще считать только данные, и отсортировать. загрузи данных 5000 строк хотябы, и если не будет использовать, ТОГДА будем думать. Пробовали на базе 500 000+ как и писал в стартовом посте alex564657498765453select * from table order by name limit 10//индекс используеться не для сортировки, а для оптимизации выборки... как ответил выше насколько мне не изменяет память с лимитом тоже файл сорт. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 5 записей из 131 это меньше 5% не говоря о 20... Хотя мне кажется что этот процент прямо пропорционален sort_buffer_size КОГДА Я писал тут свои умозаключения, это я делал тесты по всякому меняя запросы, и сразу на двух базах идентичных(рабочая с 10к записей, и с тестовой производительности - с милиардом записей) и так да, у меня при лимите индекс используеться. НО я не отказываюсь от своей начальной фразы..ибо я гдето это слышал, хотя может в вузе, а значит для микрософта скл, но слышал точно.. что индекс для оптимизации может не использоваться для малых таблиц, ибо проще взять данные(особено если таблица уже в памяти==кешировалась) и без индекса обработать. Боллее того, когда у меня на таблице из 4 строчек(список активных серверов) подобное делать, то да..при лимите нету использования индекса, но на таблице в 30к записей есть. второе что я заметил, беру с утра счас выполняю с лимитом запрос(эксплейн) на малой таблице(10 строк) - индекс есть, повторно - индекса уже нету(в кеше таблица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 10:51:55 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38696739&tid=1834503]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 399ms |

| 0 / 0 |
