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