譯者 | 布加迪
審校 | 重樓
所有數(shù)據(jù)角色都需要強(qiáng)大的數(shù)據(jù)庫和SQL技能。在實(shí)踐中,你通常會(huì)在一天的工作中查詢超大的數(shù)據(jù)庫表(含有成千上萬行)。所以,SQL查詢的性能成為決定應(yīng)用程序整體性能的一個(gè)重要因素。
優(yōu)化不佳的查詢常常導(dǎo)致響應(yīng)時(shí)間變慢、服務(wù)器負(fù)載加大以及用戶體驗(yàn)差強(qiáng)人意。因此,理解和運(yùn)用SQL查詢優(yōu)化技術(shù)顯得必不可少。
本教程介紹了優(yōu)化SQL查詢的實(shí)用技巧。
準(zhǔn)備工作:獲取一個(gè)示例數(shù)據(jù)庫表
你在為使用的任何數(shù)據(jù)庫編寫SQL查詢時(shí)都可以使用以下技巧。但如果你希望使用一個(gè)示例數(shù)據(jù)庫表來運(yùn)行這些查詢,可以使用這個(gè)Python腳本。
它連接到一個(gè)SQLite數(shù)據(jù)庫:employees.db,創(chuàng)建一個(gè)employees表,并用10000條記錄填充該表。如上所述,你總是可以創(chuàng)建自己的示例。
1. 不要使用SELECT *,改而選擇特定的列
對(duì)于初學(xué)者來說,使用SELECT *從表中檢索所有列很常見。如果你只需要幾列(幾乎總是這樣),那么這可能很低效。
因此,使用SELECT *可能導(dǎo)致過度的數(shù)據(jù)處理,當(dāng)表有許多列或者你在處理龐大數(shù)據(jù)集時(shí)尤為如此。
不要這樣:
SELECT * FROM employees;
而要這么做:
SELECT employee_id, first_name, last_name FROM employees;
只讀取必要的列可以使查詢更具可讀性和可維護(hù)性。
2. 避免使用SELECT DISTINCT,改而使用GROUP BY
SELECT DISTINCT之所以開銷很大,是由于它需要對(duì)結(jié)果進(jìn)行排序和過濾以刪除重復(fù)項(xiàng)。最好確保查詢的數(shù)據(jù)在設(shè)計(jì)上是獨(dú)特的,使用主鍵或獨(dú)特的約束。
不要這樣:
SELECT DISTINCT department FROM employees;
下面這個(gè)帶有GROUP BY子句的查詢更有幫助:
SELECT department FROM employees GROUP BY department;
GROUP BY可以更高效,特別是在適當(dāng)索引的情況下(后面會(huì)討論索引)。因此,在編寫查詢時(shí),確保你在數(shù)據(jù)模型層面了解數(shù)據(jù)(不同的字段)。
3. 限制查詢結(jié)果
通常你會(huì)查詢有數(shù)千行的大型表,但并不總是需要處理所有行,也無法處理所有行。使用LIMIT子句(或等效子句)有助于減少返回的行數(shù),從而提升查詢性能。
你可以將結(jié)果限制為15條記錄:
SELECT employee_id, first_name, last_name FROM employees LIMIT 15
使用LIMIT子句可以縮小結(jié)果集的大小,從而減少需要處理和傳輸?shù)臄?shù)據(jù)量。這對(duì)于在應(yīng)用程序中為結(jié)果編頁碼也很有用。
4. 使用索引加快檢索
索引允許數(shù)據(jù)庫比掃描整個(gè)表更快地查找行,從而顯著提高查詢性能。它們對(duì)于WHERE、JOIN和ORDER BY子句中經(jīng)常使用的列特別有用。
下面是針對(duì)“department”列創(chuàng)建的示例索引:
CREATE INDEX idx_employee_department ON employees(department);
你現(xiàn)在可以運(yùn)行過濾' department '列的查詢,并比較執(zhí)行時(shí)間。使用索引后,你應(yīng)該能夠更快地看到使用結(jié)果。想了解有關(guān)創(chuàng)建索引和性能改進(jìn)的更多信息,參閱《如何使用索引加速SQL查詢(Python版)》。
如前所述,索引提高了對(duì)索引列進(jìn)行過濾的查詢的效率。但是創(chuàng)建太多的索引可能會(huì)成為一件壞事。這就引出了下一個(gè)技巧。
5. 謹(jǐn)慎使用索引
雖然索引提高了讀取性能,但會(huì)降低寫入性能:INSERT、UPDATE和DELETE查詢,因?yàn)槊看涡薷谋頃r(shí)都必須更新索引。根據(jù)你經(jīng)常運(yùn)行的查詢類型來兼顧索引的數(shù)量和類型很重要。
幾條可靠的規(guī)則:
- 只索引經(jīng)常查詢的列。
- 避免對(duì)基數(shù)低的列(少數(shù)唯一值)進(jìn)行過度索引。
- 定期檢查索引,并根據(jù)需要更新和刪除索引。
總之,創(chuàng)建索引以加快對(duì)經(jīng)常查詢但很少更新的列的檢索速度。這確保索引的好處壓倒維護(hù)成本。
結(jié)語
優(yōu)化SQL查詢需要了解查詢的特定需求和數(shù)據(jù)結(jié)構(gòu)。
如果避免SELECT *、謹(jǐn)慎使用SELECT DISTINCT、限制查詢結(jié)果、創(chuàng)建適當(dāng)?shù)乃饕约白⒁馑饕?/span>方面的取舍,你就可以顯著提升數(shù)據(jù)庫操作的性能和效率。
祝查詢愉快!
原文標(biāo)題:5 Tips for Improving SQL Query Performance,作者:Bala Priya C