mysql 優化記錄
需求:一個 跑馬燈播報最新中將的前20條記錄 功能,通過直接查詢數據來返回結果
問題:這種全範圍查詢,無法走索引
優化:通過redis list來優化,當新紀錄產生時,lpush,當數據量超過指定值(100或者更大),ltrim(0,20)
獲取數據時,獲取lrange。
問題&優化:子查詢不走索引,修改爲關聯查詢
問題&優化:數據插入較慢,因爲有一些不常用的索引,刪除索引
問題&優化:多次根據不同的條件查詢同一張表(數據量不大),修改爲單次查詢,在程序中再根據條件過濾
問題:
-- 查詢耗時50s左右
select * from
(
SELECT buyer_domain_id, buyer_id, buyer_mobile
FROM table_order
WHERE someCondition
GROUP BY buyer_id, buyer_domain_id HAVING COUNT(*) >= 1 AND COUNT(*) <= 100
) t LIMIT 0,1000
-- 查詢耗時13秒左右
select * from
(
SELECT buyer_domain_id, buyer_id, buyer_mobile
FROM table_order
WHERE someCondition
GROUP BY buyer_id HAVING COUNT(*) >= 1 AND COUNT(*) <= 100
) t LIMIT 0,1000
-- 查詢耗時2秒左右
SELECT buyer_domain_id, buyer_id, buyer_mobile
FROM table_order
WHERE someCondition
GROUP BY buyer_id HAVING COUNT(*) >= 1 AND COUNT(*) <= 100
LIMIT 0,1000
第一條沒走索引,還加了一層select * 全表,第二條增加了走索引,第三條減少了一層select *
問題&優化:索引列上做計算不走索引,修改爲計算好的值
問題&優化:數據類型不一致,不走索引
問題&優化:在凌晨統計昨日數據,或者在23:59統計當日數據,可以加一個年月日字段,並創建索引
問題&優化:order by create_time 可以優化爲order by id desc
問題&優化:大字段單獨存儲,
問題&優化:被關聯的表的關聯字段才需要建立索引,不是兩個表都建立
問題&優化:錯誤:exits比in好;用關聯查詢走索引效果或許更好,重要的是通過explain查看計劃
問題&優化:order by 是走索引的,所以看到select count(*) from table 比 select * from table order by id 慢是正常的。