Bonjour,
Sur du MariaDB, je connais bien LEFT JOIN mais par les sous requêtes. J'ai deux tables
Table users:
Et table users_oauth:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 +--------------------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------------+-----------------+------+-----+---------+----------------+ | user_id | int(8) unsigned | NO | PRI | NULL | auto_increment | | user_activation_key | varchar(40) | YES | | NULL | | | user_email | varchar(40) | NO | UNI | | | | user_login | varchar(30) | YES | | NULL | | | user_password | varchar(40) | YES | | NULL | | | user_firstname | varchar(30) | YES | | NULL | | | user_lastname | varchar(50) | YES | | NULL | | | user_lang | varchar(2) | NO | | en +--------------------------+-----------------+------+-----+---------+----------------+
users.user_id et users_oauth.oauth_user_id permet de lier ces deux tables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 +----------------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------------+-----------------+------+-----+---------+----------------+ | oauth_id | int(8) unsigned | NO | PRI | NULL | auto_increment | | oauth_user_id | int(8) unsigned | NO | | NULL | | | oauth_google_id | varchar(30) | YES | UNI | NULL | | | oauth_facebook_id | varchar(30) | YES | UNI | NULL | | | oauth_windowslive_id | varchar(30) | YES | UNI | NULL | | +----------------------+-----------------+------+-----+---------+----------------+
Il y a un index fulltext pour la table users comme ceci:
La requêtes suivant sans le LEFT JOIN prends 0.0360 secondes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part ALTER TABLE `users` ADD FULLTEXT KEY `fulltext_adminsearch` (`user_email`,`user_firstname`,`user_lastname`);
Mais si j'ajoute un LEFT JOIN pour avoir le résultat de users_oauth je passe à 3.0237secondes (83 fois plus lent):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT users.* FROM users WHERE ( (MATCH (user_email, user_firstname, user_lastname) AGAINST ('+john + smith')) ) ORDER BY user_id DESC LIMIT 0,50
Il y a quand même une grosse différence entre rouler à 10 km/h et rouler à 830 km/h.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT users.*, users_oauth.* FROM users LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id WHERE ( (MATCH (user_email, user_firstname, user_lastname) AGAINST ('+john + smith')) ) ORDER BY user_id DESC LIMIT 0,50
Limite, ce serait plus rapide de faire une requête SQL par résultat (50) plutôt que le LEFT JOIN.
Comment faire une sous requête pour éviter le LEFT JOIN ? J'aimerais voir si ce sera plus rapide.
Merci,
Vincent.
PS, pour les tests, il y a environ 150 000 entrées dans la table users et 18 000 dans la table users_oauth
Partager