2011-09-10 4 views
0

J'ai 2 tables MySqlMysql Optimisation

Table_A { pk_A VARCHAR 150 PRIMARY KEY, random_data } ~ 9500 rows 
Table_B { pk_B VARCHAR 150, more_random_data } ~ 50000 rows 

Relation entre eux est un à plusieurs, pk_A sera trouvé plusieurs fois dans le col Table_B pk_B.

Mon problème est:

  • si j'activer l'indexation sur pk_B, php/mysql CRUD fonctionne très bien, mais un JOIN ou anyother requête de la ligne de commande impliquant les deux tables prend beaucoup de temps

  • si je désactive l'indexation sur pk_B, php/mysql CRUD devient laggish, mais JOIN ou anyother requête de la ligne de commande impliquant les deux tables est instantanée

Comment i améliorer mes performances de base de données (je pourrais modifier mes pk de varchar de int (11)), mais je me demandais s'il y a d'autres solutions de contournement disponibles

Merci

+1

Pourquoi -vous utilisant varchar comme clé primaire? –

+0

Comment joignez-vous les tables? Les clés PK doivent toujours être indexées et les colonnes de clé étrangère doivent également être indexées pour des jointures plus rapides. – bfavaretto

+0

Quel est le moteur utilisé. Il existe différentes considérations de performance entre MyISAM et InnoDB. – SingleNegationElimination

Répondre

2

Quelques choses à accélérer vos requêtes. Comme le suggèrent les nombreux commentaires; vous voulez toujours garder vos clés primaires aussi petites que c'est raisonnable. Une chaîne courte, disons VARCHAR(10) ne vous causera pas beaucoup de douleur, mais beaucoup plus grande que cela, vous pouvez utiliser une clé de substitution. Cela peut être rendu plus ou moins transparent en rendant la clé naturelle unique, mais pas dans la clé primaire.

TABLE_A {pk_A VARCHAR 150 clé primaire, random_data} ~ 9500 lignes Table_B {pk_B VARCHAR 150, more_random_data} ~ 50000 lignes

Votre schéma devrait probablement regarder un peu comme ceci:

CREATE TABLE `Table_A` (
    `id` INTEGER AUTO_INCREMENT PRIMARY KEY, 
    `A_name` VARCHAR(150) UNIQUE NOT NULL, 
    -- other columns 
) ENGINE = InnoDB; 

CREATE TABLE `Table_B` (
    `id` INTEGER AUTO_INCREMENT PRIMARY KEY, 
    `B_name` VARCHAR(150) UNIQUE NOT NULL, 
    `A_id` INTEGER REFERENCES `Table_A`(`id`), 
    -- other columns 
) ENGINE = InnoDB; 
+0

solution a fonctionné, il suffit de tester les temps de requête et c'est génial! –