1. 程式人生 > >MySQL面試題之如何優化一條有問題的SQL語句?

MySQL面試題之如何優化一條有問題的SQL語句?

類型 審查 存儲ip code 減少 提高 利用 存儲空間 not

如何優化一條有問題的sql語句?

針對sql語句的優化。我們可以從如下幾個角度去分析

  1. 回歸到表的設計層面,數據類型選擇是否合理

  2. 大表碎片的整理是否完善

  3. 表的統計信息,是不是準確的

  4. 審查表的執行計劃,判斷字段上面有沒有合適的索引

  5. 針對索引的選擇性,建立合適的索引(就又涉及到大表DDL的操作問題)

我們看第一點:數據類型要選取合適一些才好。

1)比如建議使用int來存儲ipv4的類型,然後通過函數轉換。例如:

mysql> select inet_aton(172.31.30.62);
+---------------------------+
| inet_aton(
172.31.30.62) | +---------------------------+ | 2887720510 | +---------------------------+ 1 row in set (0.00 sec) mysql> select inet_ntoa(2887720510); +-----------------------+ | inet_ntoa(2887720510) | +-----------------------+ | 172.31.30.62 | +-----------------------+ 1 row in set
(0.00 sec)

2)時間類型可以采用datetime屬性,他比timestamp可用範圍大,存儲空間也從原來的8字節降到了5字節,因此可提高性能。

3)表字符集使用 utf8,必要時可申請使用 utf8mb4 字符集。

它的通用性比 gbk,latin1 都要好。utf8 字符集存儲漢字占用 3 個字節,如果遇到表情存儲的要求,就可以使用 utf8mb4

4) select 查詢表的時候只需要獲取必要的字段,避免使用 select *。

這樣可以減少網絡帶寬消耗,還有可能利用到覆蓋索引

5)所有字段定義中,默認都加上 not null 約束,避免出現 null。

在對該字段進行 select count() 統計計數時,可以讓統計結果更準確,因為值為 null 的數據,不會被計算進去的。

6)SQL語句中,盡量避免出現 or 子句

這種判斷的子句可以讓程序自行完成,不要交給數據庫判斷。也要避免使用 union,盡量采用 union all,減少了去重和排序的工作。

MySQL面試題之如何優化一條有問題的SQL語句?