sql優化方案:
1.添加索引,在條件參數,關聯參數上創建參數,
2.字段優化,須要什麼字段查什麼字段
3.模糊查詢儘可能使用: select * from tableName a where a.name like 'name%'
避免使用 '%name%' 和 '%name';sql
3.利用explain 分析SQLmybatis
id | SELECT識別符。這是SELECT的查詢序列號 |
select_type | SELECT類型,能夠爲如下任何一種:app
|
table | 輸出的行所引用的表函數 |
type | 聯接類型。下面給出各類聯接類型,按照從最佳類型到最壞類型進行排序:fetch
|
possible_keys | 指出MySQL能使用哪一個索引在該表中找到行優化 |
key | 顯示MySQL實際決定使用的鍵(索引)。若是沒有選擇索引,鍵是NULL。 |
key_len | 顯示MySQL決定使用的鍵長度。若是鍵是NULL,則長度爲NULL。 |
ref | 顯示使用哪一個列或常數與key一塊兒從表中選擇行。 |
rows | 顯示MySQL認爲它執行查詢時必須檢查的行數。多行之間的數據相乘能夠估算要處理的行數。 |
filtered | 顯示了經過條件過濾出的行數的百分比估計值。 |
Extra | 該列包含MySQL解決查詢的詳細信息spa
|
4.常常增刪改的表建索引,也仍是有問題的,解決辦法是刪除索引,從新創建索引!插件
案例:
<select id="table_list" resultType="map" parameterType="bas.model.BasVehicleOwner" fetchSize="1000" flushCache="true">
select * from ( SELECT a.*, b. NAME AS owneridtypename,db. NAME AS logicdelstatusname FROM zc_bas_vehicle_owner a LEFT JOIN sys_dict b ON a.owneridtype = b. CODE AND b.pname = 'idtype' AND b.pid != 0 LEFT JOIN sys_dict db ON a.logicdelstatus = db. CODE AND db.pid != 0 AND db.pname = 'logicdelstatus') tab where 1=1
<!-- select * from zc_bas_vehicle_owner -->
<if test="ent.id != null and ent.id != '' ">
and id = #{ent.id }
</if>
<if test="ent.ownername != null and ent.ownername != '' ">
and ownername = #{ent.ownername }
</if>
<if test="ent.ownerid != null and ent.ownerid != '' ">
and ownerid = #{ent.ownerid }
</if>
<if test="ent.weixin != null and ent.weixin != '' ">
and weixin = #{ent.weixin }
</if>
<if test="ent.logicdelstatus != null and ent.logicdelstatus != '' ">
and logicdelstatus = #{ent.logicdelstatus }
</if>
</select>code
治超項目數據查詢慢是多方面的:
1.SQL自己關聯了多張表
關聯了2次字典表
2.分頁SQL:
查詢兩次:
2.1 查詢分頁數據結果集查詢效率還能夠
2.2 查詢總記錄數很慢
很慢的緣由是查詢了全部數據而後再coun(1)
SQL: select count(1) from + ( 上面的SQL )+條件排序
優化方案1:
分開單表查詢,而後利用Java遍歷設置字典值
List<Map<String, Object>> table_list = isBasVehicleOwnerMapper.table_list(page,ent);
List<Map<String, Object>> dictList1 = publicMapper.getDictList(null, "idtype");
List<Map<String, Object>> dictList2 = publicMapper.getDictList(null, "logicdelstatus");
for(Map<String,Object> map : table_list) {
map.put("owneridtypename", null);
map.put("logicdelstatusname", null);
for(Map<String,Object> map1: dictList1) {
if(String.valueOf(map.get("owneridtype")).equals(map1.get("code"))) {
map.put("owneridtypename", map1.get("name"));
break;
}
}
for(Map<String,Object> map2: dictList2) {
if(String.valueOf(map.get("logicdelstatus")).equals(map2.get("code"))) {
map.put("logicdelstatusname", map2.get("name"));
break;
}
}
}
優化方案2:
mybatis-plus 分頁插件不查詢總記錄數2.18版本(注意版本各個版本方法不一致)
page.setSearchCount(false);
自定義SQL查詢總記錄數設置
page.setTotal(total);
方案1和方案2實際對比:方案1只適合單表和字典表關聯查詢,多個表複雜查詢就很差操做了方案2查詢頁碼比較大的數據時候就很慢了,這個方案1沒有出現