Heim  >  Artikel  >  Datenbank  >  MySQL-Datenbankoptimierung (5) – MySQL-Abfrageoptimierung

MySQL-Datenbankoptimierung (5) – MySQL-Abfrageoptimierung

黄舟
黄舟Original
2017-02-27 13:54:401660Durchsuche

1. MySQL-Abfragetyp (alle Datenspalten werden standardmäßig abgefragt)
1. Innerer Join
Standard-Multiple Tabellen Relevante Abfragemethode, alle Felder in zwei Tabellen abfragen; das Schlüsselwort „Inner Join“ kann weggelassen werden
2. Outer Join: Abfrage aller Daten in einer bestimmten Tabelle

um alle Felder der ersten Tabelle abzufragen
(2) Rechtsverknüpfung
um alle Felder der zweiten Tabelle abzufragen. Die übereinstimmenden Daten in Tabelle eins sind leer null

3. Unterverbindung

--内连接  查询出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. Ideen zur Abfrageoptimierung
1. Warum ist es langsam?
Bevor Sie versuchen, die Abfrage zu optimieren, müssen Sie verstehen, was die Abfrage langsam macht. Wenn die Abfrage als eine aus n Unteraufgaben bestehende Aufgabe betrachtet wird, bedeutet die Optimierung der Abfrage tatsächlich, dass einige Unteraufgaben eliminiert werden oder die Anzahl der Unteraufgaben verringert wird.
2. Was sind die Teilaufgaben?
Mysql verfügt im Allgemeinen über mehrere Prozesse zum Ausführen einer Abfrage: Der Client sendet die Abfrageanweisung an den Server –> der Server analysiert die Abfrageanweisung –> Die Ausführung der Abfrage ist die wichtigste Phase des gesamten Lebenszyklus, einschließlich des Datenverarbeitungsprozesses zum Aufrufen der Datenbank-Engine, Sortieren und Gruppieren.
3. Optimierungsrichtung
1. Abfragedaten optimieren
Grundlegender Grund für ineffiziente Abfrage: Zugriff auch Es werden viele Daten angefordert und es ist zwangsläufig viel Screening-Arbeit erforderlich.
Fehlerversuch:

select * from t_user t inner join t_role r inner join t_permission p where .....

Fehlergrund: Verwendung von Inner Join, Abfrage Holen Sie sich alle Datenspalten in den drei Tabellen
Korrekter Weg:

select t.name,r.rolename,p.pname from t_user t inner join t_role r inner join t_permission p where

2. Abfrage teilen
Teilen und erobern, komplexe Abfragen in kleine Abfragen aufteilen, jede Abfrage gibt nur einen kleinen Teil der Ergebnisse zurück
Fehlerversuch:

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)

Fehlergrund: Wenn die Datenmenge in der Benutzertabelle sehr groß ist, führt das einmalige Abfragen oder Löschen einer großen Datenmenge in der Tabelle zu Wartepausen.
Richtige Vorgehensweise:

select * from t_user t  where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH)  limit 0,1000;

>Fragen Sie zuerst die ersten 1000 Daten in der Tabelle ab, die die Bedingungen erfüllen.
3. Zerlegen Sie die zugehörige Abfrage.
Fehlerversuch:

select t.name,r.rolename,p.pname from t_user t inner join t_role r inner join t_permission p where

Fehlergrund: Wenn die Datenmenge in der Benutzertabelle sehr groß ist, führt das einmalige Abfragen oder Löschen einer großen Datenmenge in der Tabelle zu Wartepausen;
Richtige Methode:

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)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn