1. 程式人生 > 實用技巧 >SQL常見bug及優化(適合資料量大的資料庫)

SQL常見bug及優化(適合資料量大的資料庫)

1.SQL走查

1.1.規範樣例

1.1.1.建索引一級bug

由各個小組先統計可能需要的索引列,然後討論統一新增索引

1.1.2.模糊匹配 一級bug

模糊匹配(like) ,不允許關鍵字前面模糊,特殊情況除外,定義如下原則:

l列表總資料量 在1萬 以內的 模糊查詢 可以支援 前後模糊匹配

l列表總資料量 大於1萬的,最多關鍵字在前面精確匹配,右邊模糊匹配

l單號查詢,走精確匹配

1.1.3.SQL類似子查詢邏輯 一級bug

建議抽離到java中單獨去查詢

子查詢列表集合非常大的,建議採用 exists查詢

1.1.4.多餘的查詢 一級bug

優化建議:SELECT COUNT(DISTINCT sku) FROM t_im_bill_asn_dtl WHERE asn_no = '123' AND real_a_qty > 0

原因:distinct底層也是採用 groupby, 因它不需要排序,所以採用的是鬆散索引掃描,掃描索引鍵的一部分

group by, 因要排序,所以掃描整個索引鍵

結論:同等條件下 distinct效率高些。當 disctinct無法實現時,採用group by.

1.1.5.Select * 一級bug

1.1.6.Join表數量大於3張表 一級bug

如果預測資料量大的時候,建議拆開處理(目前兩年時間來料+銷退 預計18萬資料)

1.1.7.用於統計時,Groupby 多欄位(超過3個)一級bug

Groupby 多欄位 除了分組排序以外,如果是統計資料 用了groupby 多個欄位,需要優化。

1.1.8.SQL where條件 儘量不用使用函式處理

Ø1.1.2事例中,採用了replace函式,對入參進行函式操作屬二級bug,建議將此操作放入java層面進行處理

Ø採用函式對錶中欄位進行操作後,再進行邏輯比較,屬一級bug,必須避免

1.1.9.SQL where條件硬編碼 二級bug

所有業務欄位查詢條件,建議都通過引數傳遞,而不是硬編碼寫死(魔法值)

1.1.10.Mapper.xml 二級bug

Mapper.xml配置sql檔案中,儘量採用標籤配置,例如 <where>

1.1.11.Select裡面採用類似concat函式 二級bug

建議將這的操作 放到java應用程式進行處理

1.1.12.可列舉的查詢欄位,建議放到條件最後 二級bug