Mes tables db sont en croissance très rapide (et continuera), à ce moment j'ai un problème avec cette requête (bien, d'autres aussi):Mysql: Optimiser requête sur les tables énormes
select user_id from post where user_id not in (select id from user)
Ce que je dois est les nouveaux identifiants qui sont dans la table de la poste et il n'y a pas de table utilisateur.
est l'expliquer ici:
> mysql> explain select user_id from post where user_id not in (select
> id from user);
>
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra |
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+
| 1 | PRIMARY | post | ALL | NULL |NULL | NULL | NULL | 16076920 | Using where |
| 2 | DEPENDENT SUBQUERY | user | unique_subquery | PRIMARY | PRIMARY | 8 | func | 1 | Using index |
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+
J'ai essayé d'autres aussi:
SELECT p.user_id FROM post p LEFT JOIN user u ON p.user_id=u.id WHERE u.id IS NULL;
L'expliquer:
mysql> EXPLAIN SELECT p.user_id FROM post p LEFT JOIN user u ON p.user_id=u.id WHERE u.id IS NULL;
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+
| 1 | SIMPLE | p | ALL | NULL | NULL | NULL | NULL | 14323335 | |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 8 | ghost.p.user_id | 1 | Using where; Using index; Not exists |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+
Les deux requêtes doivent voir le poste tableau au complet, et il est très énorme: tableau de la poste: 16077899 entrées table de l'utilisateur: 9657158 entrées
La requête prend plusieurs minutes (plus de 30 minutes) à effectuer, une astuce?
Merci!
Votre deuxième requête devrait renvoyer beaucoup de lignes nulles, puisque u.id ne s'affichera que s'il est nul. Peut-être que vous voulez p.user_id à la place. Est-ce qu'il fonctionne aussi lentement que la première requête? –
Pouvez-vous ajouter la table déclare s'il vous plaît? – Kickstart
Joachim, tu as raison, j'ai changé la deuxième requête. – user3364621