суббота, 9 февраля 2013 г.

поиск в mysql индексирование

Тут видим следующую важную информацию. Похоже, что условие (source=’twitter’), а следовательно и колонка SOURCE вовсе не является селективной, т.к. почти не уменьшит количество рядков в выборке (549 и 550 - практически никакой разницы). Т.о. эту колонку не имеет смысла ставить в индекс.

*************************** 1. row ***************************

FROM tbl WHERE STATUS='waiting'\G

sum(no_send_before = 20), count(*)

Идем далее. Вытащим выбранную колонку из выборки и поставим ее в условие. Это поможет таким же образом определить следующую колонку в индексе:

Наиболее селективной колонкой в этом случае будет STATUS (после выборки по ней придется проверить максимум 550 рядков). Значит эту колонку ставим первой в индексе.

sum(no_send_before = 20): 36569

*************************** 1. row ***************************

sum(no_send_before = 20), count(*)

SELECT sum(STATUS='waiting'), sum(source='twitter'),

Для эффективного индекса, первой должна быть наиболее селективная колонка (т.о. количество возможных рядков выборки будет минимальным). Учитывая это, мы можем просто посчитать количество рядков, удовлетворяющих каждому условию в нашем запросе:

Не будем вдаваться в подробности (что это за таблица, и что это за запрос такой), это не так важно. На данный момент таблица не содержит индексов, что показывает EXPLAIN (full table scan). Нам необходимо определить, какой индекс будет наиболее оптимальным для такого запроса.

SELECT * FROM tbl WHERE STATUS='waiting' AND source='twitter'

Допустим, у нас есть запрос, который возвращает 0 рядков:

Как это можно выяснить? Простой и очень интересный пример взят с блога mysqlPerformanceBlog. Этот способ анализа индексов применим не только к MySQL, а и к другим СУБД.

Как мы выбираем, по каким колонкам в MySQL строить индексы? Иногда не все так очевидно, как кажется. Эффективность того или иного индекса зачастую зависит от распределения данных в таблице. Правильный, на первый взгляд, индекс может работать крайне не эффективно в зависимости от специфики и частоты данных.

Как выбрать колонки для индексирования в MySQL

> > Как выбрать колонки для индексирования в MySQL

Масштабирование и производительность, высокие нагрузки, PHP, Mysql

Как выбрать колонки для индексирования в MySQL Highload Web

Комментариев нет:

Отправить комментарий