SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.03.2008 15:50:08

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Создание индексов

Бодрого времени суток!

Передо мною постала задача - ускорить работу базы. В таблице порядка 3кк записей, есть несколько индексов, экспериментирую на конкретном запросе с ипользованием поиска по 8 полям. Специально для этого создал новый индекс, включающий поля поиска.

При созданном индексе по двум полям, эксплейн запроса показал следующее:

   key_len               ref                  rows       
       7            const,const                87       

При созданном индексе по четырём полям, эксплейн запроса показал такое:

   key_len               ref                  rows       
      11     const,const,const,const      1         

Естественно во втором случае в индексе оказалось значительно больше элементов, чем в первом.

пхпмайадмин показал примерно одинаковое время выполнения запроса на обоих индексах.
Возникает вопрос, какой индекс более "ровный"? На что стоит обращать внимание при построении индекса? На его длину или на количество элементов в нём?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#2 12.03.2008 13:02:21

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Создание индексов

Возможно в Вашем запросе добавление полей к индексу его уже не ускоряет (так как и так быстро). Увеличивая размер индекса, Вы замедляете вставку и несколько замедляете поиск (так как требуется считывать более длинный индекс). При создании индекса следует максимизировать CARDINALITY ( SHOW INDEX FROM имя_таблицы), но при этом сохраняя разумный объем и количество индексов, чтобы INSERT и UPDATE не стали доминировать по ресурсам.

Посмотрите также тему здесь: http://sqlinfo.ru/forum/viewtopic.php?id=151

Неактивен

 

#3 16.03.2008 21:37:18

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Создание индексов

Ага, кое-что понял новое для себя, спасибо smile
А вот по поводу "максимизировать CARDINALITY" наверное не правильно понял, ибо вижу противоречие. Ведь большее количество CARDINALITY увеличивает длину индекса, а ранее было сказано "Увеличивая размер индекса, Вы замедляете вставку и несколько замедляете поиск". Поясните плз.

Кстати, в данной ситуации, для INSERT и UPDATE в конфиге поставил меньший приоритет.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#4 16.03.2008 21:45:46

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Создание индексов

А вот по поводу "максимизировать CARDINALITY" наверное не правильно понял, ибо вижу противоречие. Ведь большее количество CARDINALITY увеличивает длину индекса, а ранее было сказано "Увеличивая размер индекса, Вы замедляете вставку и несколько замедляете поиск". Поясните плз.

Это не противоречие, а компромисс. Вам следует максимизировать CARDINALITY, при этом сохраняя объем индекса в разумных пределах. Могут быть разные варианты. Учитывайте, что для MyISAM производительности сильно растет если индекс полностью влезает в кэш (кстати статья: http://sqlinfo.ru/articles/info/3.html). Может быть так, что памяти у Вас много и индексы влезают с запасом в кэш, тогда их можно расширять и дополнять ради ускорения поиска. Если кэш становится узким местом, то следует сократить индексы.

Нельзя приступать к оптимизации производительности, если Вы не выявили узкие места. Так как я отвечал на общий вопрос, то и ответ был общий, содержащий две крайности (наиболее быстрый поиск, наиболее быстрая вставка). Практика все ставит на свои места.

Неактивен

 

#5 16.03.2008 22:36:19

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Создание индексов

Спасибо за разъяснения, будем учиться дальше wink


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson