1. 程式人生 > >如何寫出高效的SQL語句(從建表到查詢一步一步往後說)

如何寫出高效的SQL語句(從建表到查詢一步一步往後說)

建表時可以得出以下優化建議

1、 資料型別儘量用數字型,數字型比字元型的快

2、 選擇正確的表引擎

MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。甚至你只是需要update一個欄位,整個表都會被鎖起來,而別的程序,就算是讀程序都無法操作直到讀操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。InnoDB 的趨勢會是一個非常複雜的儲存引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支援行鎖,於是在寫操作比較多的時候,會更優秀。並且,他還支援更多的高階應用,比如:事務。

3、 選擇合適的資料型別。

如果你有一個欄位,比如

性別國家民族狀態部門,你知道這些欄位的取值是有限而且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR

4、 儘量給欄位加上NOT NULL

5、 一個表不要加太多索引,因為索引影響插入和更新的速度

6、 適當的使用冗餘的反正規化設計,以空間換時間有的時候會很高效

查詢的時候得出的優化建議

7、 儘量不要在資料庫中做運算

8、 使用預處理語句。例如使用PDO來操作mysql

在效能方面,當一個相同的查詢被使用多次的時候,這會為你帶來可觀的效能優勢。你可以給這些Prepared Statements(預處理語句)定義一些引數,而MySQL只會解析一次。


9、 不要在生產環境程式中使用select * from 的形式查詢資料。只查詢需要使用的列

10、 查詢儘可能使用limit減少返回的行數,減少資料傳輸時間和頻寬浪費

11、 所有的SQL關鍵字用大寫,避免SQL語句重複編譯造成系統資源的浪費      

12、開啟慢查詢日誌,定期用explaindesc優化慢查詢中的SQL語句

13最先出現的條件,一定是過濾和排除掉更多結果的條件,第二齣現的次

之。

14、對查詢進行優化,儘量避免全表掃描。首先應考慮在where以及order by涉及的列上建立索引。

15、儘量避免在where子句中對欄位進行null值判斷。這會進行全表掃描

Select id,name from user where name is null;

16、儘量避免在where子句中對欄位進行表示式操作。這會導致引擎放棄使用索引而進行全表掃描

SELECT id,name FROM user where age/12;

17、使用連線(join)代替子查詢select * from customInfo where customId in ( select customId from saleInfo  )

18、對於OR子句,如果要利用索引,則OR之間的每個條件列都必須用到索引,如果沒有索引,則應該考慮增加索引。