2013-11-28 6 views
9

Я изучаю индекс MySQL и обнаружил, что этот индекс следует применять к любому столбцу, названному в предложении WHERE запроса SELECT.MySQL beginner - множественный индекс столбца

Затем я нашел Multiple Column Index vs Multiple Indexes.

Первый вопрос, мне было интересно, что такое индекс столбцов. Я нашел код ниже от Joomla, это индекс нескольких столбцов?

CREATE TABLE `extensions` (
    `extension_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) NOT NULL, 
    `type` VARCHAR(20) NOT NULL, 
    `element` VARCHAR(100) NOT NULL, 
    `folder` VARCHAR(100) NOT NULL, 
    `client_id` TINYINT(3) NOT NULL, 
    ... ... 
    PRIMARY KEY (`extension_id`), 

    // does code below is multiple column index? 

    INDEX `element_clientid` (`element`, `client_id`), 
    INDEX `element_folder_clientid` (`element`, `folder`, `client_id`), 
    INDEX `extension` (`type`, `element`, `folder`, `client_id`) 
) 

Второй вопрос. Правильно ли, если вы думаете, что один индекс столбцов используется на одном SELECT?

SELECT column_x WHERE element=y AND clinet_id=y; // index: element_clientid 

SELECT ex.col_a, tb.col_b 
    FROM extensions ex 
    LEFT JOIN table2 tb 
    ON (ex.ext_id = tb.ext_id) 
    WHERE ex.element=x AND ex.folder=y AND ex.client_id=z; // index: element_folder_clientid 

ответ

20

Общее правило для индексов хлопнуть один на любом поле используется в предложении WHERE или JOIN.

Это, как говорится, есть некоторые оптимизации, которые вы можете сделать. Если вы KNOW, то определенная комбинация полей является единственной, которая когда-либо будет использоваться в WHERE в конкретной таблице, тогда вы можете создать один многопользовательский ключ только для этих полей, например.

INDEX (field1, field2, field5) 

v.s.

INDEX (field1), 
INDEX (field2), 
INDEX (field5) 

Многопоточный индекс может быть более эффективным во многих случаях, v.s требует сканирования нескольких индексов. Недостатком является то, что индекс многополя может использоваться только в том случае, если соответствующие поля фактически используются в предложении WHERE.

С вашими выборками, так как element и field_id находятся во всех трех индексах, вам может быть лучше отключить их в свой собственный выделенный индекс. Если это переменные поля, то лучше сохранить их собственный выделенный индекс. например если вам придется менять field_id навалом, БД должна обновить 3 разных индекса, v.s. обновляя только один выделенный.

Но все сводится к бенчмаркингу - проверьте свою конкретную настройку с помощью различных настроек индекса и посмотрите, какая из них лучше всего работает. Правила больших пальцев удобны, но не работают в 100% случаев.

+0

Да, я делаю несколько тестов, основанных на поле1, и другое поле индексируется автоматически. Но я не уверен в том, что разделяю элемент и field_id независимо. – qaharmdz

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