mysql 建立索引在on 從句中_MySQL優化
一,sql查詢語句的優化
1,關於sql語句的子查詢可以優化成表連線的方式來查詢,這裡要考慮的是一對多的關係,如果出現一對多的關係的話可以使用distinct去除重複.
2,關於group by的優化需要根據實際情況靈活運用,group by可能會出現臨時表(Using temporary),檔案排序(Using filesort)等,影響效率。
可以通過關聯的子查詢,來避免產生臨時表和檔案排序,可以節省io.
3,關於limit的優化,1)通常limit的使用需要和order by一同使用,這時可以使用由索引的列或者主鍵列進行order by操作.
二,關於索引的優化
1,如何選擇合適的索引
1)在where從句,group by從句,order by從句,on從句中出現的列建立索引
2)索引欄位越小越好
3)離散度高的列放在聯合索引的前面
select count(distinct row1),count(distinct row2) from table;
count()值大的就是離散程度高.
三,關於表結構的優化
1選擇合適的資料型別
1)使用可以存下你資料的最小的資料型別
2)使用簡單的資料型別.int要比carchar型別在MySQL處理上簡單
3)儘可能的使用not null定義欄位.
4)儘量少用text型別,非用不可時最好考慮分表.
5)使用int型別儲存日期
使用from_unixtime()將int型別轉換為日期 使用unix_timestamp()將日期轉換為int
6)使用int型別ip地址
使用inet_aton()將IP地址轉化為bigint
使用inet_ntoa()將bigint轉換為IP地址
2,使用第三正規化的規範(用時間換取空間)
將表中重複量高的資料使用額外的一張表儲存,也就是常見的商品詳情和商品分類分開儲存使用的時候做表連線進行查詢.
3,使用反正規化化(用空間換取時間)
不遵守正規化化規範,將資料都放在一個表中用於減少關聯查詢提高查詢效率.
關於是否要遵守正規化化規範需要看實際情況(又水了一章)
4,為資料表做垂直拆分,將原來一個表的很多列拆分成多個列,解決表的寬度問題,通常拆分原則可以按一下進行
1),把不常用的欄位單獨存放單一個表中
2),八達的欄位獨立存放單一個表中
3)把經常一起使用的欄位放到一起
5,為資料表做水平拆分,如果資料表資料量很大的話可以同時建立多個相同的資料表將資料分開儲存,常用的水平才分方法為
1)對customer_id進行hash運算,如果要拆分成5個表則使用mod(customer_id,5)取出0-4個值
2)針對不同的hashID把資料存到不同的表中.
原文:http://www.cnblogs.com/handsome-man/p/5520815.html
相關資源:MYSQLinnodb效能優化學習總結_innodb_spin_wait_delay,mysqlspin...
————————————————
版權宣告:本文為CSDN博主「佯真愚」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/weixin_34236986/article/details/114334057