為什么80%的碼農都做不了架構師?>>> ??
order by case when 的用法(實現特殊情況的排序,如leader=1的排最前面):
select * from m_worker_project order by CASE WHEN leader = 1 THEN 100 ELSE 1000 END
項目中的動態查詢語句(參數是對象)、模糊查詢(變量格式'%${workerName}%')、特殊排序:?
<select id="findAllWorkerByWhere" resultMap="WorkerMap">
select * ,(select count(*) from m_worker_project where 1=1
<if test="projectWorktypeId>0">
and project_worktype_id=#{projectWorktypeId}
</if>
) as 'count' from m_worker_project where 1=1<if test="workerName != null and workerName!=''">
and worker_name like '%${workerName}%'
</if>
<if test="projectWorktypeId>0">
and project_worktype_id=#{projectWorktypeId}
</if>
<if test="id>0">
and id=#{id}
</if>
<if test="1==1">
and deleted=0
</if>order by CASE WHEN leader = 1 THEN 100 ELSE 1000 END
</select>
?
Mysql的分頁查詢語句的性能分析最基本的分頁方式:
SELECT
?...?
FROM
?...?
WHERE
?...?
ORDER
?BY
?... LIMIT ...
在中小數據量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引:舉例來說,如果實際SQL類似下面語句,那么在category_id, id兩列上建立復合索引比較好:
代碼如下:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10?
---(第一個參數50是偏移量,也就是顯示數據是從查詢結果第51個開始,第二個參數10是每頁顯示10條)
----ORDER BY? ?id? ?DESC(按id降序排列)【ASC是升序排列】
?
子查詢的分頁方式:
隨著數據量的增加,頁數會越來越多,查看后幾頁的SQL就可能類似:
代碼如下:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10
?
一言以蔽之,就是越往后分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢
。
此時,我們可以通過子查詢的方式來提高分頁效率,大致如下:
SELECT
?*?
FROM
? ? ?articles?
WHERE
?id >=
(
SELECT
?id?
FROM
?articles?
WHERE
?category_id = 123?
ORDER
?BY
?id LIMIT 10000, 1) LIMIT 10
?
JOIN分頁方式
SELECT
?*?
FROM
?`content`?
AS
? ?t1
JOIN
?(
SELECT
?id?
FROM
?`content`?
ORDER
?BY
?id?
desc
?LIMIT?
".($page-1)*$pagesize."
, 1)?
AS
?t2?
WHERE
?t1.id <= t2.id?
ORDER
?BY
?t1.id?
desc
?LIMIT $pagesize;
?
經過我的測試,join分頁和子查詢分頁的效率基本在一個等級上,消耗的時間也基本一致。 explain SQL語句:
id select_type?
table
?type possible_keys?
key
?key_len ref?
rows
?Extra
?PRIMARY
?<derived2> system?
NULL
?NULL
?NULL
?NULL
?1
?PRIMARY
?t1 range?
PRIMARY
?PRIMARY
?4?
NULL
?6264 Using?
where
?DERIVED content?
index
?NULL
?PRIMARY
?4?
NULL
?27085 Using?
index
?
那就直接用子查詢語句!
為什么會這樣呢?因為子查詢是在索引上完成的,而普通的查詢時在數據文件上完成的,通常來說,索引文件要比數據文件小得多,所以操作起來也會更有效率。
實際可以利用類似策略模式的方式去處理分頁,比如:判斷如果是一百頁以內,就使用最基本的分頁方式,大于一百頁,則使用子查詢的分頁方式。
?
?