2017-02-07 22 views
1

Я прошел через Q & A напр.Индексы MySQL: составные против столбца

How does database indexing work?

Mysql covering vs composite vs column index

Это хорошо читает, но я получил еще какой-то вопрос об индексах ИЭ. Предполагая, что ниже таблицы и выполнение планов:

CREATE TABLE student(`id` INT(9), 
          `name` VARCHAR(50), 
          `rollNum` INT(9), 
          `address` VARCHAR(50), 
          `deleted` int(2) default 0, 
          Key `name_address_key`(`name`,`deleted`), 
          Key `name_key`(`name`) 
          ); 

План 1: explain select * from student where name = "abc" and deleted =0;

его показывает ключ = name_address_key

План 2: explain select * from student where name = "abc"

его также показывает тот же ключ = name_address_key

мой вопрос: Ho w MySQl определяет индекс для плана выполнения?

ответ

1

Поскольку столбец name является префиксом name_address_key, этот индекс может использоваться для соответствия name так же, как и name_key. Нет никаких оснований полагать, что он предпочитает один за другим, но мощность name_address_key предположительно выше, поэтому он выбирает этот.

Нет смысла иметь name_key, так как он является избыточным с name_address_key и просто убирает пространство.

1

Я бы ожидал, что он примет name_key, так как размер индекса меньше.

Я бы порекомендовал удалить name_key как по существу бесполезный, так как обсуждает @Barmar.

Не надо 4-байтовый int для флагов (deleted), см. TINYINT и другие более мелкие типы данных.

У вас есть PRIMARY KEY.

Другой хорошо читать (в моем предвзятое мнение): Indexing Cookbook

+0

спасибо за поваренную книгу. – Suraj