2011-01-05 1 views
1

J'ai la table T1 où col A est la clé primaire et la col B est une clé étrangère qui est une clé primaire dans la table T2. Je veux créer un index en T1, un composite en tant que (B, A). Mais MySQL me permet de créer l'index comme (A, B) seulement. Est-ce parce que le col B est une clé étrangère? S'il vous plaît expliquerIndexation MySQL avec deux colonnes, dont l'une est une clé étrangère

+0

Pourriez-vous s'il vous plaît poster les scripts que vous utilisez? – Quassnoi

+0

Et l'erreur que vous obtenez ... – Unreason

Répondre

2

Cela fonctionne bien pour moi:

CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; 
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b INT NOT NULL REFERENCES t2(id)) ENGINE=InnoDB; 
CREATE INDEX ix_t1_b_a ON t1 (b, a); 

Bien que InnoDB ne comprend la clé cluster comme un pointeur de ligne dans les index, il n'y a rien qui empêche l'ajout du champ explicitement et parfois il est nécessaire d'optimiser certaines requêtes.

Veuillez vérifier votre syntaxe.

0

Je pense que cela n'a pas de sens. Vous essayez de créer un index composite à l'aide d'une colonne qui est déjà unique (les clés primaires sont uniques).

0

Puisque vous utilisez InnoDB comme moteur de stockage, un index sur la colonne B seul comprendra la colonne A (la clé primaire)

http://www.mysqlperformanceblog.com/2006/10/03/mysql-optimizer-and-innodb-primary-key/

+0

dans mon cas, en fait, à la fois col A et B sont des clés primaires et COL B est également une clé étrangère. donc mysql vous donne un index par défaut comme composite (A, B). mais je veux (b, a) –

+0

@patruni donc créer un index sur B et il comprendra - derrière la scène - la colonne A aussi. (puisque A est la colonne la plus à gauche dans l'index de clé primaire) –

+0

@Scrum Meister: Mais je n'ai pas besoin de créer un index sur B car mysql me donne un index par défaut car c'est une clé étrangère. Voulez-vous dire que cet index comprend A aussi derrière la scène? –

0

grappes InnoDB les données à l'aide de la clé primaire. Si vous ne définissez pas la clé primaire, InnoDB essaiera à la place d'utiliser un index unique non nullable. Cela garantira que les lignes sont insérées dans un ordre séquentiel et offrira de meilleures performances pour les jointures à l'aide des clés primaires. Mais dans ma question, j'ai dit que dans le tableau T1, le PK est le col A et le col B est une clé étrangère qui n'est pas unique dans T1. Donc, si je mets pk comme (A, B), mysql l'indexera automatiquement comme index primaire. Si vous essayez de changer l'index en (B, A), puisque B n'est pas unique, InnoDB ne peut pas l'indexer car il utilise l'indexation de cluster. Donc, il va jeter une erreur.

Questions connexes