MySQL面試題之如何優化一條有問題的SQL語句?
阿新 • • 發佈:2019-01-17
類型 審查 存儲ip code 減少 提高 利用 存儲空間 not
如何優化一條有問題的sql語句?
針對sql語句的優化。我們可以從如下幾個角度去分析
-
回歸到表的設計層面,數據類型選擇是否合理
-
大表碎片的整理是否完善
-
表的統計信息,是不是準確的
-
審查表的執行計劃,判斷字段上面有沒有合適的索引
-
針對索引的選擇性,建立合適的索引(就又涉及到大表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語句?