Maison > Article > base de données > Optimisation de la base de données MySQL (5) – Optimisation des requêtes MySQL
1. Type de requête MySQL (toutes les colonnes de données sont interrogées par défaut)
1. Jointure interne
Multiple par défaut. tables Méthode de requête pertinente, interrogez tous les champs dans deux tables ; le mot-clé de jointure interne peut être omis
2. La jointure externe interroge toutes les données d'une certaine table
(1) joins à gauche.
pour interroger tous les champs de la première table
(2) Rejoignez à droite
pour interroger tous les champs de la deuxième table Les données correspondantes dans la première table sont vides. null
3. Sous-connexion
--内连接 查询出bookID=book类型ID的记录 SELECT tb.bookName,tby.bookTypeName FROM t_book tb,t_bookType tby WHERE tb.bookTypeId=tby.id; --外连接(左连接) SELECT tb.bookName,tby.bookTypeName FROM t_book LEFT JOIN t_bookType ON t_book.bookTypeId=t_bookType.id where ......; --外连接(右连接) SELECT tb.bookName,tby.bookTypeName FROM t_book RIGHT JOIN t_bookType ON t_book.bookTypeId=t_bookType.id where ......; --子查询 SELECT * FROM t_book WHERE booktypeId IN (SELECT id FROM t_booktype); SELECT * FROM t_book WHERE booktypeId NOT IN (SELECT id FROM t_booktype); SELECT * FROM t_book WHERE price>=(SELECT price FROM t_pricelevel WHERE priceLevel=1); SELECT * FROM t_book WHERE EXISTS (SELECT * FROM t_booktype); SELECT * FROM t_book WHERE NOT EXISTS (SELECT * FROM t_booktype); SELECT * FROM t_book WHERE price>= ANY (SELECT price FROM t_pricelevel); SELECT * FROM t_book WHERE price>= ALL (SELECT price FROM t_pricelevel);
2. Idées d'optimisation des requêtes
1. Pourquoi est-ce lent ?
Avant d'essayer d'optimiser la requête, vous devez comprendre ce qui ralentit la requête ? Si la requête est considérée comme une tâche composée de n sous-tâches, à mesure que les sous-tâches augmentent, les requêtes liées à SQL augmentent également ; optimiser la requête signifie en fait optimiser ces n sous-tâches, soit en éliminant certaines sous-tâches, soit en réduisant le nombre d'exécutions de sous-tâches.
2. Quelles sont les sous-tâches ?
Mysql dispose généralement de plusieurs processus pour exécuter une requête : le client envoie l'instruction de requête au serveur -> le serveur analyse l'instruction de requête -> Exécuter la requête ; l'exécution est l'étape la plus importante de tout le cycle de vie, y compris le processus de traitement des données consistant à appeler le moteur de base de données, à trier et à regrouper.
3. Direction d'optimisation
1. Optimiser les données de requête
Raison de base d'une requête inefficace : accès trop beaucoup de données sont demandées et beaucoup de travail de filtrage est inévitablement requis
Tentative d'erreur :
select * from t_user t inner join t_role r inner join t_permission p where .....
Raison de l'erreur : utilisation de la jointure interne, requête ; Obtenez toutes les colonnes de données dans les trois tables
Méthode correcte :
select t.name,r.rolename,p.pname from t_user t inner join t_role r inner join t_permission p where
2. Requête divisée
Diviser et conquérir, diviser les requêtes complexes en petites requêtes, chaque requête ne renvoie qu'une petite partie des résultats
Tentative d'erreur :
select * from t_user t where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH) delete from t_user t where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH)
Raison de l'erreur : Lorsque la quantité de données dans la table utilisateur est énorme, une requête unique ou la suppression d'une grande quantité de données dans la table entraînera des pauses d'attente
Méthode correcte :
select * from t_user t where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH) limit 0,1000;;
>Interrogez d'abord les 1000 premières données de la table qui remplissent les conditions
3. Décomposer la requête associée
Tentative d'erreur : .
select t.name,r.rolename,p.pname from t_user t inner join t_role r inner join t_permission p where
Raison de l'erreur : lorsque la quantité de données dans la table utilisateur est énorme, une requête unique ou la suppression d'une grande quantité de données dans la table entraînera des pauses d'attente
Méthode correcte :
select * from t_user where t.age=10; select t. rolename from t_user where ... select t. pname from t_user where ...
分解关联查询表面上好像原本1个sql就干完的事,现在非得由3个sql去完成,实际上它比关联查询更有优势:
(1)提高缓存效率:对于第一条查询中age=10这条记录的所有字段已经缓存在mysql中,供第二个查询语句使用
(2)减少单个查询间的锁竞争
(3)减少冗余字段的查询
四、总结
在平时的应用中,尤其在在java开发提供了良好的数据持久化框架,对于mysql的查询优化并未过分关系,并且在使用sql执行查询时,可能也经常使用到多表关联查询,在使用这些sql拼接的过程中,对于sql优化不能不知晓,在应对高并发问题中,除了在web服务器前做负载、平行扩展等措施之外,数据库高并发的解决方案也与其并重,而这一个一个sql就是应多高并发的优化基础,不容小觑。
以上就是MySQL数据库优化(五)—MySQL查询优化的内容,更多相关内容请关注PHP中文网(www.php.cn)!