SQL教程 作為關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,是IT從業(yè)人員必不可少的技能之一。SQL 本身并不難學(xué),編寫查詢語句也很容易,但是想要編寫出能夠高效運行的查詢語句卻有一定的難度。
推薦(免費):SQL教程
查詢優(yōu)化是一個復(fù)雜的工程,涉及從硬件到參數(shù)配置、不同數(shù)據(jù)庫的解析器、優(yōu)化器實現(xiàn)、SQL 語句的執(zhí)行順序、索引以及統(tǒng)計信息的采集等,甚至應(yīng)用程序和系統(tǒng)的整體架構(gòu)。本文介紹幾個關(guān)鍵法則,可以幫助我們編寫高效的 SQL 查詢;尤其是對于初學(xué)者而言,這些法則至少可以避免我們寫出性能很差的查詢語句。
以下法則適用于各種關(guān)系型數(shù)據(jù)庫,包括但不限于:MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite 等。如果覺得文章有用,歡迎評論、點贊、轉(zhuǎn)發(fā)朋友圈支持。
法則一:只返回需要的結(jié)果
一定要為查詢語句指定 WHERE 條件,過濾掉不需要的數(shù)據(jù)行。通常來說,OLTP 系統(tǒng)每次只需要從大量數(shù)據(jù)中返回很少的幾條記錄;指定查詢條件可以幫助我們通過索引返回結(jié)果,而不是全表掃描。絕大多數(shù)情況下使用索引時的性能更好,因為索引(B-樹、B+樹、B*樹)執(zhí)行的是二進制搜索,具有對數(shù)時間復(fù)雜度,而不是線性時間復(fù)雜度。以下是 MySQL 聚簇索引的示意圖:舉例來說,假設(shè)每個索引分支節(jié)點可以存儲 100 個記錄,100 萬(1003)條記錄只需要 3 層 B-樹即可完成索引。通過索引查找數(shù)據(jù)時需要讀取 3 次索引數(shù)據(jù)(每次磁盤 IO 讀取整個分支節(jié)點),加上 1 次磁盤 IO 讀取數(shù)據(jù)即可得到查詢結(jié)果。純干貨!15000 字語法手冊分享給你
相反,如果采用全表掃描,需要執(zhí)行的磁盤 IO 次數(shù)可能高出幾個數(shù)量級。當(dāng)數(shù)據(jù)量增加到 1 億(1004)時,B-樹索引只需要再增加 1 次索引 IO 即可;而全表掃描則需要再增加幾個數(shù)量級的 IO。
同理,我們應(yīng)該避免使用 SELECT * FROM, 因為它表示查詢表中的所有字段。這種寫法通常導(dǎo)致數(shù)據(jù)庫需要讀取