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

Я пытаюсь оптимизировать следующую таблицу, согласно phpMyAdmin, несколько статистических данных о сканировании таблиц высоки, а индексы не существуют или не используются. (обработчик считывает rnd next 5,7 M)

1.

$query = "
  SELECT * FROM apps_discrep
  WHERE discrep_station = '$station'
  AND discrep_date = '$date'
  ORDER BY discrep_timestart";

2.

$query = "
  SELECT * FROM apps_discrep
  WHERE discrep_date BETWEEN '$keyword' AND '$keyword3'
  AND (discrep_station like '$keyword2%') ORDER BY discrep_date";

Правильно ли индексировать discrep_station, discrep_date и discrep_timestart? В настоящее время существует только первичный уникальный индекс для идентификатора с автоинкрементом.

-- Структура таблицы

`index` int(11) NOT NULL AUTO_INCREMENT,
discrep_station varchar(5) NOT NULL,
discrep_timestart time NOT NULL,
discrep_timestop time NOT NULL,
discrep_date date NOT NULL,
discrep_datetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
discrep_show varchar(31) NOT NULL,
discrep_text text NOT NULL,
discrep_by varchar(11) NOT NULL,
discrep_opr varchar(11) NOT NULL,
email_traffic varchar(3) NOT NULL,
email_techs varchar(3) NOT NULL,
email_promos varchar(3) NOT NULL,
email_spots varchar(3) NOT NULL,
eas_row varchar(11) NOT NULL,
PRIMARY KEY (`index`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8;

person Stephen Bush    schedule 22.04.2013    source источник


Ответы (1)


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

Используйте эту страницу документации MySQL в качестве справочной информации.

ALTER TABLE xxx ADD KEY `key1` (`discrep_station`, `discrep_date`, `discrep_timestart`) USING BTREE;

Ваш первый запрос будет использовать все 3 поля в индексе. Второй запрос будет использовать только первые 2 поля в индексе.

person mbarlocker    schedule 22.04.2013