Bonjour

Je vous soumets ce petit problem.

J'ai deux tables: recent_etats et ack_etats.
recent_etats est vide pour ce test et ack_etats contient 100k lignes.

J'ai une vue qui englobe c'est deux tables:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
create view etats as
select  * from recent_etats
union all
select * from ack_etats;
je genere le premier plan:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
mysql> explain select distinct(object_type) from ack_etats;
+----+-------------+-----------+-------+---------------+--------------+---------+------+------+--------------------------+
| id | select_type | table     | type  | possible_keys | key          | key_len | ref  | rows | Extra                    |
+----+-------------+-----------+-------+---------------+--------------+---------+------+------+--------------------------+
|  1 | SIMPLE      | ack_etats | range | NULL          | i2_ack_etats | 130     | NULL |    5 | Using index for group-by |
+----+-------------+-----------+-------+---------------+--------------+---------+------+------+--------------------------+
Normal il utilise l'index sur object_type.

Maintenant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
mysql> explain select distinct(object_type) from etats;
+----+--------------+--------------+------+---------------+------+---------+------+--------+-----------------+
| id | select_type  | table        | type | possible_keys | key  | key_len | ref  | rows   | Extra           |
+----+--------------+--------------+------+---------------+------+---------+------+--------+-----------------+
|  1 | PRIMARY      | <derived2>   | ALL  | NULL          | NULL | NULL    | NULL | 100000 | Using temporary |
|  2 | DERIVED      | recent_etats | ALL  | NULL          | NULL | NULL    | NULL |      1 |                 |
|  3 | UNION        | ack_etats    | ALL  | NULL          | NULL | NULL    | NULL | 102199 |                 |
| NULL | UNION RESULT | <union2,3>   | ALL  | NULL          | NULL | NULL    | NULL |   NULL |                 |                                        
+----+--------------+--------------+------+---------------+------+---------+------+--------+-----------------+
Bizarre il fait un full scan maitenant sur la table ack_etats.

Pourquoi il n'utilise pas l'index avec l'utilisation de la vue ?

Maintenant si je mets 6 millions de lignes dans ack_etats la commande explain ne repond plus (j'ai attendus 15min avant de stop) !!!! probleme mysql ne semble plus capable de genere le plan ?

j'aimerais votre avis

Merci d'avance

Sébastien