|
|
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
В базе есть 3 таблицы. Две таблицы с некоторыми данными, преимущественно текстовыми. Третья таблица соединяет эти две, связаны они как "один ко многим". В таблице 1 есть два текстовых поля. Для обоих созданы индексы. Но одно уникальное, а другое - нет. Есть запрос по трем таблицам который возвращает все записи, соответствующие заданному условию. Проблема в том, что если я в запросе упоминаю оба поля из 1й таблицы, то запрос выполняется 30 секунд (записей больше 2х млн.). Если же я в WHERE не упоминаю "не уникальное" поле, то запрос выполняется 3 сек. Почему так происходит и как этот запрос оптимизировать? Сам запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. По обоим полям создан идекс, но: vs_vowel - уникальное vs_vowel_noorder - не уникальное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2014, 08:13:55 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
P.S. про индексы читал, вроде как теоретически они должны использоваться в этом запросе, если я правильно понял. Но похоже на то, что не используются. Если так, то интересно почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2014, 08:16:10 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
плохо читал. иначе бы где промелькнуло explain и не гадал бы - используються или нет, и е сли да то какие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2014, 11:33:07 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Читал про EXPLAIN, пробовал, но результаты только мельком просмотрел. Сейчас снова вернулся, перечитал, проанализировал. Оказывается при запросе были 2 возможных ключа (столбец possible_keys) - первичный и индексированный, но MySQL выбирал первичный ключ. Заставил его выбирать индексированный столбец (USE INDEX (vs_vowel_noorder)) - время выполнения сократилось с 30ти до 9ти секунд. Но все равно интересно, почему так, ведь рядом стоит другое поле vs_vowel, которое тоже индексировано и по размеру тоже VARCHAR(100) и данные почти одинаковые. Единственное отличие полей то что vs_vowel - уникальное, а vs_vowel_noorder - нет. Почему тогда в первом случае запрос выполняется за 1 секунду и возвращает 700 записей, а во втором за 9 секунд и возвращает 900 записей (количество записей для примера, оно не играет роли на время выполнения запроса)? Какие еще могут быть причины? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 12:23:35 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
Еще, если сравнить результаты выполнения EXPLAIN "быстрого" и "долгого" запроса, то в "быстром" в колонке ref используется только const, а в "долгом" используется - "const,pronun_vowel.pv_vowel_i". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 12:27:06 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
Random2alex564657498765453, Читал про EXPLAIN, пробовал, но результаты только мельком просмотрел. Сейчас снова вернулся, перечитал, проанализировал. Оказывается при запросе были 2 возможных ключа (столбец possible_keys) - первичный и индексированный, но MySQL выбирал первичный ключ. Заставил его выбирать индексированный столбец (USE INDEX (vs_vowel_noorder)) - время выполнения сократилось с 30ти до 9ти секунд. Но все равно интересно, почему так, ведь рядом стоит другое поле vs_vowel, которое тоже индексировано и по размеру тоже VARCHAR(100) и данные почти одинаковые. Единственное отличие полей то что vs_vowel - уникальное, а vs_vowel_noorder - нет. Почему тогда в первом случае запрос выполняется за 1 секунду и возвращает 700 записей, а во втором за 9 секунд и возвращает 900 записей (количество записей для примера, оно не играет роли на время выполнения запроса)? Какие еще могут быть причины? потому что как ты себе представляешь чтение одной таблицы по двум индексам??? один индекс(ключ=10 - записи 1,22,234,777,543534....) другой индекс(ключ="вася" - записи 23,43,567,777,432523...) и что делать? в теории можно прочитать два индекса и сделать пересечение множеств - но будет ли это быстрее чем прочитать таблицу по одному индексу и откинуть лишнии записи??? вообщем мускл идёт всегда по пути второму - используюет один индекс, если надо чтоб по двум - делать состовной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 12:36:46 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
alex564657498765453в теории можно прочитать два индекса и сделать пересечение множеств - но будет ли это быстрее чем прочитать таблицу по одному индексу и откинуть лишнии записи?некоторые другие СУБД умеют оценивать, будет или нет мускл ЕМНИП тоже научился, с версии 5.5 вроде бы, но хреновастенько ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 12:39:58 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
Пробовал и до этого составные индексы, но результат был не тот - такое же долгое время выполнения запроса. Почему же я тогда не догадался использовать EXPLAIN, скорее всего мускул просто не использовал составной индекс. Сейчас сделал составной и заставил использовать его - совсем другое дело - 2 секунды на выполнение запроса! Читая хелп по оптимизации и просматривая примеры остается еще много непонятного - еще расти и расти, но на ошибках получаешь опыт - узнал про команду EXPLAIN и принудительное использование индексов. Спасибо alex564657498765453 и sql.ru! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 13:01:58 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
tangliralex564657498765453в теории можно прочитать два индекса и сделать пересечение множеств - но будет ли это быстрее чем прочитать таблицу по одному индексу и откинуть лишнии записи?некоторые другие СУБД умеют оценивать, будет или нет мускл ЕМНИП тоже научился, с версии 5.5 вроде бы, но хреновастенько знаю. видел както в експлейне мерге индекса...но не помню что за запрос я делал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 14:48:21 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
Есть еще один интересный момент. Тестирую запросы на локалхосте и на сервере. На локалхосте специально поставил очень маленькие размеры для всех буфферов в my.ini, но на локалхосте MySQL запущен на SSD. На сервере значения для буфферов больше, но скорее всего используется HDD. В итоге получается, запросы на сервере выполняются в 10 раз дольше, т.е. на локальном компьютере добился скорости в 500-1000 мс, а на сервере такой же запрос в той же БД занимает 8-10 сек. Все дело в SSD и HDD или как это понять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 21:51:38 |
|
||
|
Скорость выполнения SELECT и индексы
|
|||
|---|---|---|---|
|
#18+
Random2Есть еще один интересный момент. Тестирую запросы на локалхосте и на сервере. На локалхосте специально поставил очень маленькие размеры для всех буфферов в my.ini, но на локалхосте MySQL запущен на SSD. На сервере значения для буфферов больше, но скорее всего используется HDD. В итоге получается, запросы на сервере выполняются в 10 раз дольше, т.е. на локальном компьютере добился скорости в 500-1000 мс, а на сервере такой же запрос в той же БД занимает 8-10 сек. Все дело в SSD и HDD или как это понять? выше я вроде писал, что время чтения на обычном винчестере в раз 10 больше чем на ссд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 15:55:35 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38703342&tid=1834466]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
81ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 405ms |

| 0 / 0 |
