Heim  >  Artikel  >  Datenbank  >  Untersuchung der MySQL-Paging-Leistung

Untersuchung der MySQL-Paging-Leistung

小云云
小云云Original
2017-12-08 11:52:261499Durchsuche

Paging wird in unserer Programmierung häufig verwendet. Dieser Artikel führt Sie dazu, die Leistung von MySQL-Paging zu diskutieren, in der Hoffnung, allen zu helfen.

Gemeinsame Paging-Methoden:

1. Escalator-Methode

Die Rolltreppenmethode bietet normalerweise nur zwei Navigationsmodi: vorherige Seite/nächste Seite. Einige Produkte bieten nicht einmal die Funktion „Vorherige Seite“, sondern nur eine „Mehr/Mehr“-Methode, und es gibt auch ein automatisches Dropdown-Laden. Weitere Methoden können technisch als Rolltreppenmethoden zusammengefasst werden.
Die Rolltreppenmethode ist hinsichtlich der technischen Umsetzung relativ einfach und effizient. Gehen Sie einfach eine Seite weiter, basierend auf dem Versatz des letzten Elements auf der aktuellen Seite. Als SQL geschrieben ähnelt es möglicherweise

SELECT*FROMLIST_TABLEWHEREid> offset_id LIMIT n;

1. Elevator-Methode

Eine andere Datenerfassungsmethode spiegelt sich in der genauen Umblättermethode des Produkts wider, z. B. 1,2,3...n. Gleichzeitig kann der Benutzer auch Eingabe direkt auf n Seiten der Navigation. In den meisten Szenen in China werden Aufzüge verwendet, die technischen Implementierungskosten von Aufzügen sind jedoch relativ hoch.

In MySQL wird in der Speicher-Engine-Implementierung normalerweise der B-Baum als B+Baum bezeichnet.

Wenn der Benutzer bei Verwendung der Aufzugsmethode angibt, zur n-ten Seite umzublättern, gibt es keine direkte Möglichkeit, den Standort anzusprechen. Stattdessen muss er ab dem ersten Stockwerk einzeln zählen und scannen, um zu zählen *Seite zum Abrufen der Daten Es hat gerade erst begonnen, daher ist die Effizienz nicht hoch.

Traditionelle Paging-Technologie (Aufzugsmethode)

Zuerst muss Ihnen das Frontend die Paging-Entität und die Abfragebedingungen übergeben

//分页实体
structFinanceDcPage{
1:i32 pageSize,//页容量
2:i32 pageIndex,//当前页索引
}

Dann müssen Sie die Gesamtzahl der Abfragen an das Frontend zurückgeben;

SELECTCOUNT(*)FROMmy_tableWHEREx= y ORDERBYid;

Dann zurück Geben Sie die Anzahl der Seiten zum Frontend an:

SELECT*FROMmy_tableWHEREx= y ORDERBYdate_colLIMIT (pageIndex - 1)* pageSize, pageSize;

Die von den beiden oben genannten SQL-Anweisungen abgefragten Ergebnisse müssen zurückgegeben werden die Front-End-Paging-Entität sowie einzelne Seitenergebnisse eingestellt

//分页实体
structFinanceDcPage{
1:i32 pageSize,//页容量
2:i32 pageIndex,//当前页索引
3:i32 pageTotal,//总页数
4:i32 totalRecod,//总条数
}

Traditionelle Abfragemethode, das heißt, nur der pageIndex-Wert ändert sich bei jeder Anfrage , Limit-Offset, Offset von num

wie limit 0,10; limit10,10;

Die oben genannten Änderungen führen zu einer Abweichung in der Ausführungszeit Die Abfrage dauert umso länger, je größer der Offsetwert ist, z. B. limit10000, 10. Es müssen 10010 Daten gelesen werden, um die gewünschten 10 Daten zu erhalten.

Optimierungsmethode

Bei der traditionellen Methode haben wir gelernt, dass der Schlüssel zur Effizienz darin liegt, dass das Programm viele unnötige Daten durchläuft und findet der Schlüssel Klicken Sie also hier.

Wenn kein Bedarf besteht, den Aufzug zu benutzen, können wir die Rolltreppe nutzen, um die Leistung zu verbessern.

Aber in den meisten Fällen kann die Aufzugsform die Bedürfnisse der Benutzer besser erfüllen, daher müssen wir einen anderen Weg finden, die Aufzugsform zu optimieren.

Optimierung auf Basis traditioneller Methoden

Die oben genannten Optimierungsmethoden sind entweder schwer den Bedürfnissen der Benutzer gerecht zu werden oder zu komplex in der Implementierung Wenn die Datenmenge nicht besonders groß ist, beispielsweise Millionen von Daten, besteht eigentlich keine Notwendigkeit, die obige Optimierungsmethode zu verwenden.

Herkömmliche Methoden reichen aus, müssen aber möglicherweise auch optimiert werden. Beispiel:

orderby-Optimierung

SELECT*FROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000,5

ORDERBY wird in dieser Anweisung verwendet Schlüsselwörter, dann ist es sehr wichtig, was zu sortieren ist. Wenn Sie automatisch inkrementierende IDs sortieren, muss diese Anweisung nicht optimiert werden. Wenn es sich um einen Index oder sogar um einen Nicht-Index handelt, muss sie optimiert werden.

Zuerst muss man sicherstellen, dass es sich um einen Index handelt, sonst wird es sehr langsam. Wenn es sich dann um einen Index handelt, der jedoch nicht so geordnet ist wie eine automatisch inkrementierende ID, muss er wie folgt umgeschrieben werden.

SELECT*FROMpa_dc_flowINNERJOIN(SELECTidFROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000,5)ASpa_dc_flow_idUSING(id);

Das Folgende ist das EXPLAIN für zwei SQL


Auf dem Bild können wir sehen, dass das zweite SQL viel weniger Seiten scannen kann.

Eigentlich handelt es sich hierbei um die Optimierungsfrage der Reihenfolge nach. Der subject_code-Index wird im ersten SQL nicht verwendet. Wenn Sie stattdessen subject_code auswählen, wird der Index verwendet. Das Folgende ist die Optimierung der Reihenfolge nach.

order by后的字段,如果要走索引,须与where 条件里的某字段建立复合索引!!或者说orcerby后的字段如果要走索引排序,它要么与where条件里的字段建立复合索引【这里建立复合索引的时候,需要注意复合索引的列顺序为(where字段,order by字段),这样才能满足最左列原则,原因可能是order by字段并能算在where 查询条件中!】,要么它自身要在where条件里被引用到!

表asubject_code为普通字段,上面建有索引,id是自增主键

select*fromaorderbysubject_code//用不上索引
selectidfromaorderbysubject_code//能用上索引
selectsubject_codefromaorderbysubject_code//能用上索引
select*fromawheresubject_code= XX orderbysubject_code//能用上索引

意思是说order by 要避免使用文件系统排序,要么把order by的字段出现在select后,要么使用order by字段出现在where 条件里,要么把order by字段与where条件字段建立复合索引!

第二条sql就是巧妙的利用第二种方式利用上了索引。 select id from a order bysubject_code,这种方式

count优化

当数据量非常大时,其实可以输出总数的大概数据,利用explain语句,他并没有真正去执行sql,而是进行的估算。

相关推荐:

MySQL分页性能优化指南

php mysql分页类(php新手入门)

php+mysql分页代码详解_PHP教程

Das obige ist der detaillierte Inhalt vonUntersuchung der MySQL-Paging-Leistung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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