2010-02-14 1 views
2

Je suis très confus avec les index de MySQL.Deux ensembles de tables indenticales avec des jointures utilisant des index dans MySQL; on a besoin d'une analyse de table complète

J'ai deux tables: TableA1 et TableA2.

J'ai créé des index sur ceux-ci pour les jointures entre eux et les requêtes s'exécutent très rapidement.

J'ai deux autres tables avec une configuration identique, par ex. TableB1 et TableB2. La seule différence est que ces tables ont quelques valeurs nulles.

Pour une raison quelconque, la même requête sur TableA est environ 5 fois plus rapide et ne nécessite pas d'analyse de table complète. TableB semble cependant utiliser une analyse de table complète et je ne peux pas comprendre pourquoi. Serait-ce les valeurs nulles qui causent cela?

Je remarque en utilisant EXPLAIN que sur la configuration de TableA, j'obtiens possible keys: myindex et aussi ref: func; Cependant, sur la configuration de TableB, je n'ai que possible keys: NULL et ref: NULL.

J'ai cherché pendant un bon moment sur ceci, et n'arrive pas à trouver une réponse pertinente. Apprécierait si quelqu'un peut me diriger dans la bonne direction.

(Désolé, maintenant ajouté à la question initiale.)

Voici TableAOne:

CREATE TABLE `TableAOne` (
    `field1` varchar(255) DEFAULT NULL, 
    `field2` varchar(255) DEFAULT NULL, 
    KEY `myindex` (`field1`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Et TableATwo:

CREATE TABLE `TableATwo` (
    `Field3` varchar(255) , 
    `Field4` varchar(255) , 
    `Field5` varchar(255) , 
    `id` int(20) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=15522 DEFAULT CHARSET=utf8; 

Je rejoins Field3 avec Champ1.

Les tables qui obtiennent l'analyse de table complète sont identiques aux tables ci-dessus. La seule différence est qu'ils sont appelés TableB au lieu de TableA.

Cheers,
Ke

+1

Pouvez-vous poster vos scripts de création de table et peut-être aussi un nombre de lignes de chaque table? –

+1

Est-ce que 'NULL' est une valeur valide à lier entre les tables B? Sinon, excluez-les en utilisant 'AND b2.col IS NOT NULL' dans les critères JOIN, et' WHERE b1.col IS NOT NULL' –

+0

yep NULL est une valeur valide, il y a aussi des valeurs vides (pas sûr si c'est sage !!), je voudrais garder les valeurs nulles et vides, je posterai les tables de création dans un instant aussi –

Répondre

0

Je viens de supprimer la table et réinstallée à la db (je l'ai fait le changement UTF8 latin1 ne sais pas si cela fait une différence), mais il fonctionne maintenant, vraiment étrange! merci beaucoup pour toutes les réponses, ils m'ont certainement poussé vers la réponse acclamations :)

+0

il s'est avéré être le jeu de caractères utf8 vs latin1 qui causait le problème. –

Questions connexes