2014-01-13 2 views
0

У меня есть следующая таблица (T) в Mysql:MySQL лучший показатель для статической таблицы

+--------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+--------+-------------+------+-----+---------+-------+ 
| first | varchar(50) | NO | PRI | NULL |  | 
| second | varchar(50) | NO | PRI | NULL |  | 
| third | varchar(50) | NO | PRI | NULL |  | 
| count | bigint(20) | NO |  | NULL |  | 
+--------+-------------+------+-----+---------+-------+ 

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

+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| T  |   0 | PRIMARY |   1 | first  | A   |  591956 |  NULL | NULL |  | BTREE  |   |    | 
| T  |   0 | PRIMARY |   2 | second  | A   | 67927032 |  NULL | NULL |  | BTREE  |   |    | 
| T  |   0 | PRIMARY |   3 | third  | A   | 271708128 |  NULL | NULL |  | BTREE  |   |    | 
| T  |   1 | SECONDARY |   1 | second  | A   |  398399 |  NULL | NULL |  | BTREE  |   |    | 
| T  |   1 | SECONDARY |   2 | third  | A   | 45284688 |  NULL | NULL |  | BTREE  |   |    | 
| T  |   1 | SEC  |   1 | second  | A   |  4382389 |  NULL | NULL |  | BTREE  |   |    | 
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 

поисковые запросы типа:

SELECT * FROM T WHERE first = "WHAT" AND third = "EVER"; 

и

SELECT * FROM T WHERE first = "WHAT" AND second = "EVER"; 

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

SELECT * FROM T WHERE second = "WHAT" AND third = "EVER"; 

очень медленно (обычно более 1 минуты). Я создал индекс SEC (см. Таблицу индексов), но это не улучшает результаты.

Какой индекс следует использовать для ускорения этих поисков? (Я не продолжал экспериментировать, потому что создание одного индекса занимает около 5 часов)

Дополнительная информация: Таблица статична (т.е. я не буду добавлять никаких строк - меня интересует только скорость поиска), а дисковое пространство не является проблемой.

ответ

0

Используйте дополнительные индексы, содержащие поля, соответствующие вашим запросам. Если комбинации строк уникальны, используйте первичные индексы. Это дает более быстрый доступ, чем вторичные индексы. Поскольку таблица статична - количество индексов не влияет на производительность (любые обновления, удаления и вставки требуют обновления для каждого индекса таблицы).

Таким образом, для более быстрого извлечения из этого запроса создать индекс second и third столбцов:

ALTER TABLE T ADD PRIMARY KEY (second, third); 
+0

В таблице уже есть первичный ключ (первый, второй, третий) [см таблицу выше]. Я также попытался добавить дополнительный индекс (первый, второй), но не улучшил результаты. – m41n1

+0

Perdon me - Я имел в виду вторую и третью колонки. Ответ исправлен. индекс (первый, второй, третий) не может использоваться для запроса только для столбцов второй и третьей. Как правило, порядок будет другим. – suspectus

+0

Этот индекс уже существует «SECONDARY» (см. Таблицу индексов выше). В настоящее время у меня есть ПЕРВИЧНЫЙ КЛЮЧ (первый, второй, третий), индекс, который охватывает (второй, третий) и другой индекс только во втором столбце. – m41n1

Смежные вопросы