je la table MySql suivante (seulement 845 lignes):MySql - Full balayage de table sur JOIN requête
CREATE TABLE `categories_nested_set` (
`lft` int(11) NOT NULL DEFAULT '0',
`rgt` int(11) DEFAULT NULL,
`id` int(11) DEFAULT NULL,
`category` varchar(128) DEFAULT NULL,
PRIMARY KEY (`lft`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `rgt` (`rgt`),
KEY `idx_lftrgtid` (`id`,`lft`,`rgt`),
KEY `idx_lft` (`lft`),
KEY `i1` (`lft`) USING BTREE,
KEY `i2` (`rgt`) USING BTREE,
KEY `i3` (`id`) USING BTREE,
CONSTRAINT `fk_categories_nested_set_id_category` FOREIGN KEY (`id`) REFERENCES `categories` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(vous pouvez voir que j'ai beaucoup d'indices là-bas, juste au cas où).
-je effectuer l'auto-jointure requête suivante:
SELECT *
FROM categories_nested_set AS H
LEFT JOIN categories_nested_set AS I ON (H.lft > I.lft)
qui génère les éléments suivants EXPLIQUEZ:
id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,H,ALL,NULL,NULL,NULL,NULL,845,NULL
1,SIMPLE,I,ALL,"PRIMARY,idx_lft,i1",NULL,NULL,NULL,845,"Range checked for each record (index map: 0x31)"
Explain suggère que MySql est le choix de ne pas utiliser un index, et je ne peux pas comprendre pourquoi. La définition de la table montre que toutes les colonnes pertinentes sont indexées.
Dans le cadre d'une requête beaucoup plus grande (5 millions de lignes, 14 tables), cette pièce s'avère être un énorme goulot d'étranglement. Tout avis sera le bienvenu.
Merci,
L'ensemble de données sur lequel vous avez exécuté 'EXPLAIN' n'a-t-il réellement que 845 lignes? MySQL n'utilisera pas nécessairement un index si, par exemple, l'ensemble de données est suffisamment petit. Vous devriez obtenir des statistiques de performance sur la requête plus large. –
Oui, seulement 845 lignes. Différent expliquer sur la plus grande requête, évidemment beaucoup plus élaborée, mais néanmoins un balayage de table complet. – mils
Eh bien, vous devez faire au moins un balayage complet de la table, pour la table sur le côté gauche de la jointure. –