一:針對where 條件 order by 字段 優化 (2014-10-22)
問題:只要加上order by 速度就很慢
介紹:乙個文章表,大小有1.6g,表結構是
id(主鍵遞增) nid(**書id) vid(**章節id) content(**內容) time(時間)
業務要求:搜尋出每本**的前12個最新章節
sql:
select id,name,content from table where nid=1024 order by time desc limit 12
優化經歷:
原本表中對nid這個欄位加個索引,時間快了一點,但是只要使用order by就頓時慢了,所以就要想辦法優化order by
對這塊的優化,最好是使用聯合索引,針對nid和time
alter table table add index nid_time_index(nid,time);
速度明顯上公升,問題解決
二:針對聯合查詢join order by limit優化(2014-10-23)
問題:表中400w+資料,left join聯合查詢,如果加上order by 後,速度慢很多
原始sql:
select * from t_people p left join t_team t on p.team_id=t.id order by p.pname limit 10;
優化:create index pnameindex on t_people (pname asc)
select * from (select * from t_people porder by p.pnamelimit 10) p left join t_team t on p.team_id=t.id limit 10;
參考:
總結:針對以上兩個優化經歷,可以得出結論是" mysql資料庫是先搜尋後排序 ",這樣時間就消耗的多了,因此優化就是先篩選出需要的資料,再去排序
三:1.謹慎使用text/blob型別
當列型別是text或者blob時,我們應該特別注意,因為當選擇的字段有 text/blob 型別的時候,無法建立記憶體表,只能建立硬碟臨時表,而硬碟臨時表的效能比記憶體表的效能差,所以如果非要使用text/blob型別,應該單獨建表,不要把text/blob型別與核心屬性混合在一張表中
2.慎用子查詢
幾乎所有子查詢都可以改寫為連線查詢,有時候,連線查詢的效率要比子查詢高,所以把子查詢改寫成連線查詢是乙個不錯的注意。如果一條使用子查詢的select語句執行時間過長,那麼就應該嘗試把它改寫為連線查詢,看他是不是執行的更好。
select
*
from
emp
where
ename
in
(
select
ename
from
ename);
select
emp.*
from
emp
inner
join
ename
on
emp.ename=ename.ename;
3.在distinct列上增加索引
4.在group by後面增加order by null
在使用group by分組查詢時,預設分組後,還會排序,可能會降低速度。如果不需要排序,那麼可以在group by後面增加order by null,這樣可以避免分組後排序
資料庫優化 記一次Mysql的優化經歷
1.建立乙個課程表 create table course c id int primary key,name varchar 10 2.建立乙個學生表create table student s id int primary key,name varchar 10 3.建立乙個課程學生表creat...
資料庫優化 資料庫設計優化
一 索引優化 1.首先索引不是越多越好,要視情況而定。因為索引會降低insert和update的效率 insert和update有時可能會重建索引。2.乙個表的索參數量最好不要超過6個,擇優而建。3.專案上線後,根據使用者的查詢條件字段稍微調整資料庫中的字段索引。二 分表 1.縱切 根據表字段來且分...
資料庫引擎優化顧問優化資料庫
現在一直在做的專案,資料量相對也不小,開始的時候沒有覺得,因為是剛開始,資料量還很小,在程式使用過程中速度還挺快,但是隨著資料量的不停的增長,發現程式越來越慢,甚至出現了超時的問題,因此要對程式和資料庫進行優化,前期專案比較緊,沒有針對大資料量業務進行分析設計,所以索引等相關優化沒有做到位,通過後期...