1、基本語句優化php
1.儘可能避免在列上進行運算,這樣會致使索引失敗。例如:mysql
select * from table where DATE_FORMAT(`customer_regtime`,'%Y')>='2010'算法
優化爲sql
select * from table where customer_regtime>='2010-01-01'緩存
2.在使用join時,應該根據功能的須要儘可能使用小結果集驅動大結果集。同時把複雜的join查詢拆分紅多個query。由於join多表時,可能致使更多的鎖定和堵塞。函數
3.僅列出須要的字段,這對查詢速度沒有影響,可是對內存能夠節省不少。例如:性能
select * from customer;優化
優化爲spa
select customer_id,customer_name from customer;設計
4.使用批量插入時節省交互例如:
insert into a1(name) values('name1');
insert into a1(name) values('name2');
insert into a1(name) values('name3');
insert into a1(name) values('name4');
優化爲:
insert into a1(name) values('name1'),('name2'),('name3'),('name4');
5.limit 的基數比較大時,可使用where between 或其餘方式代替。
6.不要使用rand函數獲取多條隨機數據例如:
select * from a2 order by rand() limit 20;
可使用php參數隨機數使用 mysql in 查詢 。
7.避免使用null
8.不要使用count(id),因該使用count(*)
9.不要作無謂的排序操做,儘量的在索引中完成。
2、索引與性能分析
查看sql執行的效率能夠經過開始 profiling 來查看
set profiling =1;
開啓後執行sql語句mysql就會分析執行該sql 的詳細報告
例如 多執行幾遍
select * from a2;
而後 查看
show profiles;
第一次用時是最長的比後面的時間變多了幾乎一倍,這是由於mysql緩存了查詢。
若是須要查看某一個語句的細節可使用
show profile cpu,block io for query 4;
結果爲:
查看select 語句在執行過程當中是否用到索引,若是是聯合查詢時聯合的順序類型等信息可使用explain
explain select * from a2;
結果爲:
個屬性含有以下
id:查詢序列號
select_type:查詢的類型,主要包括普通查詢,聯合查詢、子查詢。
table:查詢的代表。
type:聯合查詢使用的類型。
possible_keys:表示mysql能使用哪一個索引在該表中找到該行。若是這個值是空就表示沒有用到索引,能夠經過檢查where子句,看看是否引用了某些字段。
key:顯示mysql實際決定使用的鍵。若是沒有索引被應用則爲空。
key_len:顯示mysql決定使用的鍵長度。若是鍵是null這個也是null。這個值反應出一個多重主鍵裏實際使用了哪部分。
ref:顯示哪一個字段或常數與key一塊兒被使用。
rows:這個值表示mysql要便利多少數據才能找到須要的結果集,在innodb上不許確。
extra:若是是 only index,意味着信息只能用索引樹中的信息檢索,這比掃描整個表要快,若是是where used,則表示使用了where 限制,可是用索引還不夠,若是是impossi-ble where,則表示經過收集到的統計信息判斷出不可能存在的結果。除此以外,extra還有下面一些可能值:using filesort:表示包含orderby 且沒法使用索引進行排序操做時,不得不使用相應的排序算法實現。using temporary:使用臨時表,常見於orderby和group by。select tables optimized way:使用聚合函數,而且mysql進行了快速定位。一般是max,min,count(*) 等函數。
type特別說明:type顯示的訪問類型是較重要的指標:結果重好到壞一次是:system(系統表),const(讀常量),eq_tef(最大一條比配結果,一般是經過主鍵訪問),ref(被驅動表索引引用),fulltext(全文索引檢索),ref_of_null(帶空值的索引查詢),index_merge(合併索引結果集),unique_subquery(子查詢中返回的字段是惟一組合或索引),index_subquery(子查詢返回的是索引,但非主鍵),range(索引範圍掃描),index(全索引燒苗),all(全表掃描)。
通常來講,保證查詢至少range級,最好能達到ref級。all爲全表掃描,是最壞的狀況,表示沒有用到索引。
索引的創建和使用原則:
合理設計和使用索引。
在關鍵字段的索引上,建與不建索引,查詢數度相差近100倍。
差的索引和沒有索引想過同樣。
索引並不是越多越好,由於維護須要成本。
每一個表的索引在5個一下,應合理利用部分索引和聯合索引。
不在結果集中的結果單一的列上創建索引。好比性別字段只有0和1兩種結果,在這個字段上創建索引不會有太大的幫助。
建索引的字段結果集最好分佈均勻,或者符合正態分佈。