2012-04-15 15 views
7

Ich habe eine sehr einfache Abfrage:Meine einfache MySQL-Abfrage nicht verwendet Index

SELECT comments.* 
    FROM comments 
    WHERE comments.imageid=46 

Und das ist meine Tabelle:

CREATE TABLE IF NOT EXISTS `comments` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `imageid` int(10) unsigned NOT NULL DEFAULT '0', 
    `uid` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `content` text CHARACTER SET utf8, 
    `adate` datetime DEFAULT NULL, 
    `ip` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `ids` (`imageid`) USING BTREE, 
    KEY `dt` (`adate`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ; 

Aber MySql kann nicht Index für diese einfache Abfrage verwenden . Hier ist das erklären Ergebnis:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ALL  ids  NULL NULL NULL 4 75.00 Using where 

während ich die Abfrage zu diesem ändern, kann Mysql Index verwenden. Warum? :

SELECT comments.id 
    FROM comments 
    WHERE comments.imageid=46 

hier die erklären ist:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ref  ids  ids  4 const 4 100.00 Using index 
+0

Es ist nicht * "Aber MySql ** kann ** index ** nicht verwenden. Es ist: "Aber MySql ** wird nicht ** index verwenden". Die 'possible_keys = ids' und' key = NULL' legen nahe, dass die Verwendung des Indexes vom Optimierer untersucht und abgelehnt wurde. Der vollständige Tabellenscan wurde als schneller angesehen - und wahrscheinlich in Ihrem Fall. –

Antwort

6

Ich denke, dass Sie einige Zeilen in 'Kommentare' Tisch, deshalb MySQL eine vollständige tut Table Scan, anstatt den Index in Ihrer ersten Abfrage zu verwenden. Es wird geschätzt, dass die Kosten für einen vollständigen Tabellenscan möglicherweise niedriger sind als die ersten Übereinstimmungen mit dem Index und dann die Zeilen suchen.

In Ihrer zweiten Abfrage wird der Index verwendet, da es möglich ist, alle Spalten der Abfrage (die ID-Spalte) direkt aus dem Index abzurufen, ohne die Tabellenzeilen nach dem Index suchen zu müssen. Dies ist die Bedeutung von "Verwendung von Index" Zusatzinformationen.

Versuchen, wenn mit einer erheblichen Anzahl von Zeilen in 'Kommentare' MySQL immer noch einen vollständigen Scan verwendet, denke ich, dass es ein seltsames Verhalten wäre. In der Tat habe ich genau das gleiche in einer MySQL-Version 5.1 getestet und es verwendet immer den "Index" sogar mit wenigen Zeilen.

+0

Danke Mann, Sie haben Recht! ;) – MscEliot

1

Die zweite Abfrage ist eine indexbezogene Abfrage. Die gesamte angeforderte Information kann aus dem Index gelesen werden (da der Primärschlüssel Teil eines beliebigen Sekundärindex in InnoDB ist).

In der ersten Abfrage muss MySQL die PKs aus dem Index lesen und dann die Zeilen lesen. Da die Tabelle so wenig Zeilen enthält, entscheidet das Optimierungsprogramm, dass es schneller ist, wenn es Zeilen direkt liest und diejenigen, die nicht übereinstimmen

Verwandte Themen