Mysql производительность на 6 миллионов строк таблицы - PullRequest
16 голосов
/ 12 июля 2009

Однажды я подозреваю, что мне придется изучить hadoop и перенести все эти данные в неструктурированную базу данных, но я удивлен, обнаружив, что производительность за такое короткое время так значительно снизилась.

У меня есть таблица mysql с чуть менее 6 миллионами строк. Я делаю очень простой запрос к этой таблице и считаю, что у меня есть все правильные индексы.

запрос

SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date

Объяснение возвращается

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  updateshows     range   date_idx    date_idx    7   NULL    648997  Using where

так что я использую правильный индекс, насколько я могу судить, но этот запрос занимает 11 секунд для выполнения.

База данных MyISAM, а phpMyAdmin сообщает, что таблица равна 1,0 ГБ.

Есть идеи здесь?

Отредактировано: Date_idx индексирует как столбцы даты, так и столбцы venid. Должны ли это быть два отдельных индекса?

Ответы [ 4 ]

42 голосов
/ 12 июля 2009

Убедитесь, что запрос будет использовать ТОЛЬКО индекс, поэтому убедитесь, что индекс охватывает все поля, которые вы выбираете. Кроме того, поскольку речь идет о запросе диапазона, сначала в индексе должен быть venid, поскольку он запрашивается как константа. Поэтому я бы создал и проиндексировал так:

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time);

С этим индексом вся информация, необходимая для выполнения запроса, находится в индексе. Это означает, что, надеюсь, механизм хранения способен извлекать информацию, фактически не ища внутри самой таблицы. Однако MyISAM, возможно, не сможет этого сделать, поскольку он не сохраняет данные в листьях индексов, поэтому вы можете не получить желаемого повышения скорости. Если это так, попробуйте создать копию таблицы и использовать механизм InnoDB для этой копии. Повторите те же самые шаги там и посмотрите, получите ли вы значительное увеличение скорости. InnoDB действительно сохраняет значения полей в листьях индекса и позволяет закрывать индексы.

Теперь, надеюсь, вы увидите следующее, когда объясните запрос:

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date;

id  select_type table  type  possible_keys        key       [..]  Extra
1   SIMPLE   events range date_idx, indexNameHere indexNameHere   Using index, Using where
2 голосов
/ 12 июля 2009

Я полагаю, что таблица строк 6M должна быть оптимизирована с помощью вполне обычных методов.

Я предполагаю, что у вас есть выделенный сервер базы данных, и он имеет разумное количество оперативной памяти (скажем, минимум 8G).

Вы хотите убедиться, что настроили mysql для эффективного использования оперативной памяти. Если у вас 32-битная ОС, не надо. Если вы используете MyISAM, настройте буфер ключей так, чтобы он использовал значительную, но не слишком большую часть памяти.

В любом случае вы хотите запустить повторное тестирование производительности на оборудовании промышленного уровня.

2 голосов
/ 12 июля 2009

Попробуйте добавить ключ, который охватывает venid и date (или наоборот, или оба ...)

1 голос
/ 12 июля 2009

Попробуйте поместить индекс в столбец venid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...