Left join est ce que je veux, mais ils sont très lents?

Vue d'ensemble:

J'ai trois tables 1) les abonnés, bios, et shirtsizes et j'ai besoin de trouver les abonnés sans un bio ou shirtsizes

les tables sont disposées comme

abonnés

| season_id |  user_id |

bio

| bio_id | user_id |

shirt tailles

| bio_id | shirtsize |

Et j'ai besoin de trouver tous les utilisateurs qui n'ont pas de bio ou shirtsize, (si pas bio; alors pas de shirtsize par rapport) pour une saison donnée.

Départ, j'avais écrit une requête comme:

SELECT *
   FROM subscribers s 
   LEFT JOIN bio b ON b.user_id = subscribers.user_id 
   LEFT JOIN shirtsizes ON shirtsize.bio_id = bio.bio_id 
WHERE s.season_id = 185181 AND (bio.bio_id IS NULL OR shirtsize.size IS NULL);

mais il prend 10 secondes maintenant.

Je me demande comment je peut restructurer la requête (ou peut-être le problème) afin qu'il procède de façon raisonnable.

Voici le mysql expliquer: (ogu = abonnés, b = bio, tn = shirtshize)

| id | select_type | table | type  | possible_keys | key     | key_len | ref         | rows   | Extra       |   
+----+-------------+-------+-------+---------------+---------+---------+-------------+--------+-------------+    
|  1 | SIMPLE      | ogu   | ref   | PRIMARY       | PRIMARY | 4       | const       |    133 | Using where |
|  1 | SIMPLE      | b     | index | NULL          | PRIMARY | 8       | NULL        | 187644 | Using index |
|  1 | SIMPLE      | tn    | ref   | nid           | nid     | 4       | waka2.b.nid |      1 | Using where | 

Ci-dessus est assez aseptisée, voici la realz info:

mysql> DESCRIBE subscribers
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| subscribers  | int(11) | NO   | PRI |         |       | 
| uid       | int(11) | NO   | PRI |         |       | 


mysql> DESCRIBE bio;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| bio_id   | int(10) unsigned | NO   | PRI | 0       |       | 
| uid   | int(10) unsigned | NO   | PRI | 0       |       | 


mysql> DESCRIBE shirtsize;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| bio_id   | int(10) unsigned | NO   | PRI | 0       |       | 
| shirtsize   | int(10) unsigned | NO   | PRI | 0       |       | 

et le réel de requête ressemble:

SELECT ogu.nid, ogu.is_active, ogu.uid, b.nid AS bio_node, tn.nid AS size
                  FROM og_uid ogu
                  LEFT JOIN bio b ON b.uid = ogu.uid
                  LEFT JOIN term_node tn ON tn.nid = b.nid
                  WHERE ogu.nid = 185033 AND ogu.is_admin = 0
                  AND (b.nid IS NULL OR tn.tid IS NULL)

nid est season_id ou bio_id (avec un type);
term_node va être le shirtsize

Ces tables ont des index?
Pouvons-nous vous demandons d'inclure "SHOW CREATE TABLE" de sortie pour chaque table?

OriginalL'auteur jskulski | 2009-03-10