2017-07-14 1 views
1

J'ai un tableau ci-dessous:Est-ce que l'ordre des colonnes des index multi-colonnes dans where where est important dans MySQL?

CREATE TABLE `student` ( 
    `name` varchar(30) NOT NULL DEFAULT '', 
    `city` varchar(30) NOT NULL DEFAULT '', 
    `age` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`name`,`city`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Je veux savoir, si j'exécute les deux requêtes SQL suivantes, ont-ils les mêmes performances?

mysql> select * from student where name='John' and city='NewYork'; 
mysql> select * from student where city='NewYork' and name='John'; 

question Impliquez:

  1. S'il y a un index à plusieurs colonnes (nom, ville), les deux font SQLs tout l'utiliser?
  2. L'optimiseur change-t-il le second sql en premier à cause de l'index?

J'exercerai expliquer sur les deux d'entre eux, le résultat est ci-dessous:

mysql> explain select * from student where name='John' and city='NewYork'; 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

| 1 | SIMPLE  | student | const | PRIMARY  | PRIMARY | 184  | const,const | 1 | NULL | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

mysql> expliquer select * de l'étudiant où la ville = 'NewYork' et name = 'John';

+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

| 1 | SIMPLE  | student | const | PRIMARY  | PRIMARY | 184  | const,const | 1 | NULL | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 
+2

L'ordre des colonnes dans un index à plusieurs colonnes est important. Un index sur les colonnes 'name' et' city' peut être utilisé à la place d'un index sur la colonne 'name' mais il ne peut pas être utilisé à la place d'un index sur la colonne' city'. L'ordre des conditions dans la clause 'WHERE' n'a pas d'importance. – axiac

+0

Bienvenue dans Stack Overflow. Vous avez fait du bon travail en posant votre première question. –

+0

Livre de recettes: http://mysql.rjweb.org/doc.php/index_cookbook_mysql –

Répondre

1

L'ordre des colonnes dans un index multi-colonnes est important.

La documentation du multiple-column indexes lit:

MySQL peut utiliser des index sur plusieurs colonnes pour les requêtes qui testent toutes les colonnes de l'index, ou des requêtes ce test juste la première colonne, les deux premières colonnes, la trois premières colonnes, et ainsi de suite. Si vous spécifiez les colonnes dans le bon ordre dans la définition de l'index, un seul index composite peut accélérer plusieurs types de requêtes sur la même table.

Cela signifie un index sur des colonnes name et city peut être utilisé lorsqu'un index sur la colonne name est nécessaire, mais il ne peut pas être utilisé à la place d'un index sur la colonne city.

L'ordre des conditions dans la clause WHERE n'a pas d'importance. L'optimiseur MySQL does a lot of work sur les conditions de la clause WHERE pour éliminer autant de lignes candidates que possible le plus tôt possible et pour lire le moins de données possible à partir des tables et des index (car certaines données lues sont supprimées car elles ne le sont pas correspondre à la totalité de la clause WHERE).

1

Si, étant donné un index sur (name,city), j'exécute les deux requêtes SQL, ont-ils suivent les mêmes performances?

where name='John' and city='NewYork'

where city='NewYork' and name='John'

Oui.

Le planificateur de requêtes ne se soucie pas de l'ordre des clauses WHERE. Si les deux clauses filtrent sur l'égalité, le planificateur peut utiliser l'index. SQL est un langage déclaratif, pas procédural. Autrement dit, vous dites ce que vous voulez, pas comment l'obtenir. C'est un peu contre-intuitif pour beaucoup de programmeurs. Il peut également utiliser l'index (name,city) pour WHERE name LIKE 'Raymo%' car name est le premier dans l'index. Toutefois, il ne peut pas utiliser cet index pour WHERE city = 'Kalamazoo'.

Il peut utiliser l'index pour WHERE city LIKE 'Kalam%' AND name = 'Raymond'. Dans ce cas, il utilise l'index pour trouver la valeur du nom, puis analyse les villes correspondantes.

Si vous aviez un index sur (city,name), vous pouvez également l'utiliser pour WHERE city = 'Kalamazoo' AND name = 'Raymond'. Si les deux index existent, le planificateur de requête en choisit un, probablement en fonction d'une sorte de cardinalité.

Remarque. Si à la place vous avez deux index différents sur city et name, le planificateur de requêtes ne peut pas (à partir de la mi-2017) utiliser plus d'un d'entre eux pour satisfaire WHERE city = 'Kalamazoo' AND name = 'Raymond'.

http://use-the-index-luke.com/ pour de bonnes informations.