Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Скорость выполнения SELECT и индексы / 11 сообщений из 11, страница 1 из 1
19.07.2014, 08:13:55
    #38700929
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
В базе есть 3 таблицы. Две таблицы с некоторыми данными, преимущественно текстовыми. Третья таблица соединяет эти две, связаны они как "один ко многим".

В таблице 1 есть два текстовых поля. Для обоих созданы индексы. Но одно уникальное, а другое - нет.

Есть запрос по трем таблицам который возвращает все записи, соответствующие заданному условию.
Проблема в том, что если я в запросе упоминаю оба поля из 1й таблицы, то запрос выполняется 30 секунд (записей больше 2х млн.). Если же я в WHERE не упоминаю "не уникальное" поле, то запрос выполняется 3 сек. Почему так происходит и как этот запрос оптимизировать?

Сам запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
	w_id, w_word, w_pronun_full, w_rank, vs_id, vs_vowel
FROM
  wp_cmpd_words, wp_cmpd_pronun_vowel, wp_cmpd_vowel_symb
WHERE
  wp_cmpd_words.w_id = wp_cmpd_pronun_vowel.pv_word_id AND
  wp_cmpd_vowel_symb.vs_id = wp_cmpd_pronun_vowel.pv_vowel_id AND
                      (wp_cmpd_vowel_symb.vs_vowel = 'AE1:AE1' OR
                       (wp_cmpd_vowel_symb.vs_vowel_noorder = 'AE:AE' AND wp_cmpd_vowel_symb.vs_vowel != 'AE1:AE1'))


По обоим полям создан идекс, но:
vs_vowel - уникальное
vs_vowel_noorder - не уникальное

...
Рейтинг: 0 / 0
19.07.2014, 08:16:10
    #38700930
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
P.S. про индексы читал, вроде как теоретически они должны использоваться в этом запросе, если я правильно понял. Но похоже на то, что не используются. Если так, то интересно почему.
...
Рейтинг: 0 / 0
19.07.2014, 11:33:07
    #38700958
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
плохо читал. иначе бы где промелькнуло explain и не гадал бы - используються или нет, и е сли да то какие
...
Рейтинг: 0 / 0
22.07.2014, 12:23:35
    #38702728
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
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 записей (количество записей для примера, оно не играет роли на время выполнения запроса)? Какие еще могут быть причины?
...
Рейтинг: 0 / 0
22.07.2014, 12:27:06
    #38702735
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
Еще, если сравнить результаты выполнения EXPLAIN "быстрого" и "долгого" запроса, то в "быстром" в колонке ref используется только
const, а в "долгом" используется - "const,pronun_vowel.pv_vowel_i".
...
Рейтинг: 0 / 0
22.07.2014, 12:36:46
    #38702753
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
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...)

и что делать? в теории можно прочитать два индекса и сделать пересечение множеств - но будет ли это быстрее чем прочитать таблицу по одному индексу и откинуть лишнии записи??? вообщем мускл идёт всегда по пути второму - используюет один индекс, если надо чтоб по двум - делать состовной
...
Рейтинг: 0 / 0
22.07.2014, 12:39:58
    #38702757
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
alex564657498765453в теории можно прочитать два индекса и сделать пересечение множеств - но будет ли это быстрее чем прочитать таблицу по одному индексу и откинуть лишнии записи?некоторые другие СУБД умеют оценивать, будет или нет
мускл ЕМНИП тоже научился, с версии 5.5 вроде бы, но хреновастенько
...
Рейтинг: 0 / 0
22.07.2014, 13:01:58
    #38702792
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
Пробовал и до этого составные индексы, но результат был не тот - такое же долгое время выполнения запроса. Почему же я тогда не догадался использовать EXPLAIN, скорее всего мускул просто не использовал составной индекс.
Сейчас сделал составной и заставил использовать его - совсем другое дело - 2 секунды на выполнение запроса!
Читая хелп по оптимизации и просматривая примеры остается еще много непонятного - еще расти и расти, но на ошибках получаешь опыт - узнал про команду EXPLAIN и принудительное использование индексов. Спасибо alex564657498765453 и sql.ru!
...
Рейтинг: 0 / 0
22.07.2014, 14:48:21
    #38702989
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
tangliralex564657498765453в теории можно прочитать два индекса и сделать пересечение множеств - но будет ли это быстрее чем прочитать таблицу по одному индексу и откинуть лишнии записи?некоторые другие СУБД умеют оценивать, будет или нет
мускл ЕМНИП тоже научился, с версии 5.5 вроде бы, но хреновастенько

знаю. видел както в експлейне мерге индекса...но не помню что за запрос я делал
...
Рейтинг: 0 / 0
22.07.2014, 21:51:38
    #38703342
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
Есть еще один интересный момент. Тестирую запросы на локалхосте и на сервере. На локалхосте специально поставил очень маленькие размеры для всех буфферов в my.ini, но на локалхосте MySQL запущен на SSD. На сервере значения для буфферов больше, но скорее всего используется HDD. В итоге получается, запросы на сервере выполняются в 10 раз дольше, т.е. на локальном компьютере добился скорости в 500-1000 мс, а на сервере такой же запрос в той же БД занимает 8-10 сек. Все дело в SSD и HDD или как это понять?
...
Рейтинг: 0 / 0
23.07.2014, 15:55:35
    #38704051
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость выполнения SELECT и индексы
Random2Есть еще один интересный момент. Тестирую запросы на локалхосте и на сервере. На локалхосте специально поставил очень маленькие размеры для всех буфферов в my.ini, но на локалхосте MySQL запущен на SSD. На сервере значения для буфферов больше, но скорее всего используется HDD. В итоге получается, запросы на сервере выполняются в 10 раз дольше, т.е. на локальном компьютере добился скорости в 500-1000 мс, а на сервере такой же запрос в той же БД занимает 8-10 сек. Все дело в SSD и HDD или как это понять?

выше я вроде писал, что время чтения на обычном винчестере в раз 10 больше чем на ссд.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Скорость выполнения SELECT и индексы / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]