1. Vermeiden Sie einen vollständigen Tabellenscan
Um die Abfrage zu optimieren, überlegen Sie zunächst, wo und in welcher Reihenfolge Sie erstellen möchten ein Index der beteiligten Spalten.
2. Vermeiden Sie die Beurteilung von Nullwerten
Versuchen Sie, die Beurteilung des Nullwerts von Feldern in der where-Klausel zu vermeiden, da die Engine sonst die Verwendung des Index und aufgibt Führen Sie den vollständigen Tabellenscan durch, z. B.:
select id from t where num is null
Sie können den Standardwert 0 für „num“ festlegen, sicherstellen, dass in der Spalte „num“ in der Tabelle kein Nullwert vorhanden ist, und dann eine Abfrage wie folgt durchführen:
select id from t where num=0
(Empfehlung für ein kostenloses Lernvideo-Tutorial: MySQL-Video-Tutorial)
3. Vermeiden Sie ungleiche Werturteile
sollte in der where-Klausel != oder dem <>-Operator so weit wie möglich vermieden werden, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt.
4. Vermeiden Sie die Verwendung von or-Logik
Sie sollten versuchen, die Verwendung von or in der where-Klausel zum Verbinden von Bedingungen zu vermeiden, da dies sonst der Fall ist führt dazu, dass die Engine die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt, z. B.:
select id from t where num=10 or num=20
kann wie folgt abgefragt werden:
select id from t where num=10 union all select id from t where num=20
5. Verwenden Sie in und nicht in Logik mit Vorsicht
in und not in sollten ebenfalls mit Vorsicht verwendet werden, da dies sonst zu einem vollständigen Tabellenscan führt, z. B.:
select id from t1 where num in(select id from t2 where id > 10)
Zu diesem Zeitpunkt die äußere Abfrage scannt die gesamte Tabelle, ohne den Index zu verwenden. Es kann wie folgt geändert werden:
select id from t1,(select id from t1 where id > 10)t2 where t1.id = t2.id
Zu diesem Zeitpunkt wird der Index verwendet, was die Abfrageeffizienz erheblich verbessern kann.
6. Achten Sie auf Fuzzy-Abfrage
Die folgende Abfrage führt ebenfalls zu einem vollständigen Tabellenscan:
select id from t where name like '%abc%'
Fuzzy-Abfrage kann verwendet werden, wenn dies der Fall ist ist eine notwendige Bedingung. Wählen Sie eine ID aus, wobei ein Name wie „abc%“ zur Implementierung einer Fuzzy-Abfrage verwendet wird. Wenn der Header-Abgleich eine notwendige Logik ist, wird empfohlen, eine Volltextsuchmaschine (Elastic Search, Lucene, Solr usw.) zu verwenden.
7. Vermeiden Sie Feldberechnungen in Abfragebedingungen
Sie sollten versuchen, Ausdrucksoperationen für Felder in der where-Klausel zu vermeiden, da dies dazu führen würde, dass die Engine die Verwendung aufgibt Index. Vollständiger Tabellenscan. Beispiel:
select id from t where num/2=100
sollte geändert werden in:
select id from t where num=100*2
8. Vermeiden Sie die Ausführung von Funktionsoperationen auf Feldern in Abfragebedingungen.
sollte ebenso vermieden werden Wie möglich in der where-Klausel werden Funktionsoperationen für Felder im Feld ausgeführt, was dazu führt, dass die Engine die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt. Beispiel:
select id from t where substring(name,1,3)='abc'--name 以abc 开头的id
sollte geändert werden in:
select id from t where name like 'abc%'
9. Beachten Sie den Punkt
auf der linken Seite der WHERE-Klausel „=". Fügen Sie es nicht in den Unterabschnitt „where“ ein. Führen Sie keine Funktionen, Rechenoperationen oder andere Ausdrucksoperationen auf der linken Seite von „=" aus, da das System sonst möglicherweise nicht in der Lage ist, den Index korrekt zu verwenden.
10. Verwendung eines zusammengesetzten Index
Wenn ein Indexfeld als Bedingung verwendet wird und der Index ein zusammengesetzter Index ist, muss das erste Feld im Index verwendet werden Das System kann den Index nur verwenden, wenn er als Bedingung verwendet wird. Andernfalls wird der Index nicht verwendet und die Feldreihenfolge sollte so weit wie möglich mit der Indexreihenfolge übereinstimmen.
11. Definieren Sie keine unbedenklichen Abfragen
Schreiben Sie keine bedeutungslosen Abfragen:
select col1,col2 into #t from t where 1=0
Diese Art von Code wird Gibt nichts zurück. Die Ergebnismenge verbraucht jedoch Systemressourcen. Sie sollte wie folgt geändert werden:
create table #t(...)
12 existiert
In vielen Fällen ist dies der Fall Es empfiehlt sich, „exists“ anstelle von „in Select“ zu verwenden:
select num from a where num in(select num from b)
Ersetzen Sie es durch die folgende Anweisung:
select num from a where exists(select 1 from b where num=a.num)
13. Der Index kann auch fehlschlagen
并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL 查询可能不会去利用索引,如一表中有字段sex,male、female 几乎各一半,那么即使在sex 上建了索引也对查询效率起不了作用。
14、表格字段类型选择
尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。尽可能的使用varchar 代替char ,因为首先可变长度字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
15、查询语法中的字段
任何地方都不要使用select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
16、索引无关优化
不使用*、尽量不使用union,union all 等关键字、尽量不使用or 关键字、尽量使用等值判断。表连接建议不超过5 个。如果超过5 个,则考虑表格的设计。(互联网应用中)表连接方式使用外联优于内联。外连接有基础数据存在。
如:A left join B,基础数据是A。A inner join B,没有基础数据的,先使用笛卡尔积完成全连接,在根据连接条件得到内连接结果集。
大数据量级的表格做分页查询时,如果页码数量过大,则使用子查询配合完成分页逻辑。
Select * from table limit 1000000, 10 Select * from table where id in (select pk from table limit100000, 10)
相关文章教程推荐:mysql教程
Das obige ist der detaillierte Inhalt vonEinführung in Optimierungsstrategien für SQL-Anweisungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!