Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Имеется таблица
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_country` int(11) NOT NULL,
`id_city` int(11) NOT NULL,
`date` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `contry_city` (`id_country`,`id_city`),
KEY `country_city_date` (`id_country`,`id_city`,`date`),
KEY `country_date` (`id_country`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
В ней как вы уже успели заметить несколько составных ключей.
Вот результаты нескоторых запросов:
EXPLAIN SELECT * FROM `test` WHERE id_country = 21
possible_keys contry_city,country_city_date,country_date
key contry_city
EXPLAIN SELECT * FROM `test` WHERE id_country = 21 and id_city=106
possible_keys contry_city,country_city_date,country_date
key contry_city
EXPLAIN SELECT * FROM `test` WHERE id_country =21 and id_city =106 and date =1301558400
possible_keys contry_city,country_city_date,country_date
key country_city_date
EXPLAIN SELECT * FROM `test` WHERE id_country = 21 and date = 1301558400
possible_keys contry_city,country_city_date,country_date
key country_date
Вопрос: для каждого ли запроса выбирается наилучший составной ключ? Сколько таблица может иметь ключей? Влияет ли количество ключей на скорость SELECT-ов, на UPDATE и DELETE я думаю что влияет?
Неактивен
1. Обычно да.
2. Столько, сколько нужно для хорошей производительности.
3. Да, влияет. Каждый индекс надо сортировать и хранить
Учтите, что индексы используются как целиком, так и частями (т.е. в индексе могут
использоваться левые столбцы), поэтому индекс country_city — абсолютно бесполе-
зен (так как он полностью покрывается индексом country_city_date).
Неактивен
Скажите, а нужно ли делать составной ключ, если у меня в запросе идет сортировка по нескольким полям.
Т.е. SELECT * FROM table WHERE field = 'test' ORDER BY field1 ASC, field2 ASC, fiels3 DESC
Нужно ли делать в этом случае составной ключ на 3 поля?
Неактивен
Да.
Неактивен