2017-02-07 2 views
1

Ich habe einige Q & A eg durchlaufen.MySQL Indizes: Composite vs Spalte

How does database indexing work?

Mysql covering vs composite vs column index

Diese sind gut liest, aber ich habe noch mehr Fragen zu Indizes, dh. Tabelle unten und Ausführungspläne Unter der Annahme:

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`) 
          ); 

Plan 1: explain select * from student where name = "abc" and deleted =0;

seine Shows key = name_address_key

Plan 2: explain select * from student where name = "abc"

seine auch denselben Schlüssel zeigt = name_address_key

meine Frage ist: Ho w MySQl entscheidet den Index für den Ausführungsplan?

Antwort

1

Da die name Spalte ein Präfix von name_address_key ist, kann dieser Index für die Übereinstimmung name ebenso wie name_key verwendet werden. Es gibt keinen Grund dafür, dass es einen vor dem anderen bevorzugt, und die Kardinalität von name_address_key ist vermutlich höher, also wählt es diese.

Es hat keinen Sinn, name_key zu haben, da es mit name_address_key überflüssig ist und nur Platz verschwendet.

1

Ich würde erwarten, dass es name_key wählen, da die Größe des Index kleiner ist.

Ich würde empfehlen, name_key als im Wesentlichen nutzlos zu entfernen, wie @Barmar diskutiert.

Verwenden Sie nicht 4-Byte int für Flags (deleted), siehe TINYINT und andere kleinere Datentypen.

Haben Sie eine PRIMARY KEY.

Eine weitere gute Lese (meiner Meinung voreingenommen): Indexing Cookbook

+0

Dank für Kochbuch. – Suraj