Показатель Mysql на таблице в 6 миллионов строк

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

У меня есть таблица 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.0GiB.

Какие-нибудь идеи здесь?

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

Ответы

Ответ 1

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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