mysql优化的几种方法_详解mysql数据库不同类型sql语句优化方法
概述
分享一下之前筆記記錄的一些不同類型sql語句優化方法,針對mysql。
主要分成優化INSERT語句、優化ORDER BY語句、優化GROUP BY 語句、優化嵌套查詢、優化OR語句這幾個方面,可能寫的不是很全,大家有啥好想法可以在下方留言哦。
優化INSERT語句
當進行數據insert時,mysql客戶端大致要經過的步驟如下:
1、客戶端連接mysql服務器
2、客戶端發送INSERT語句到服務器
3、服務器解析INSERT語句
4、服務器增加數據
5、服務器給增加的記錄添加索引
6、服務器關閉連接
優化INSERT的常用方法:
1、如果從同一客戶端插入很多行數據到mysql服務器,一次性插入多個值將大大縮短客戶端與數據庫服務器之間的連接和關閉等操作,如:
insert into books values (1,'book1'),(2,'book2'),(3,'book3');
當從一個文本文件裝載一個表時,使用LOAD DATA INFILE加載數據往往比使用很多INSERT語句效率至少提高20倍。
2、對于myisam類型的表,如果從不同客戶端插入很多行,可使用INSERT DELAYED語句提升執行速度。
INSERT DELAYED INTO 是客戶端提交數據給mysql服務器,mysql服務器返回ok狀態給客戶端,而這并不是將數據立即執行插入到表,而是存儲在內存里面等待排隊,直至mysql服務器有空閑時再插入。
3、鎖定表以加速插入數據。
lock tables test write;
insert into test values (3,'t3'),(4,'t4');
unlock tables
如果不加鎖定表,每一次執行INSERT語句完成后,索引緩沖區都會被寫到磁盤上,而加入鎖定后索引緩沖區僅被寫到磁盤上一次。
優化ORDER BY語句
1、對ORDER BY + LIMIT 組合的索引優化,sql形式 如下:
SELECT [column1] ... FROM [TABLE] ORDER BY [sort ] LIMIT [offset ],[LIMIT];優化:在[sort]上建立索引。
2、對WHERE + ORDER BY +LIMIT組合的索引優化,sql形式 如下:
SELECT [column1] ... FROM [TABLE] WHERE [columnX]=[value] ORDER BY [sort ] LIMIT [offset ],[LIMIT];此時如果對[sort]添加索引,效率不是很高,可采用更高效的方法建立一個聯合索引(columnX,sort)
3、不要對where和order by的選項使用表達式或者函數,sql形式如下:
SELECT * FROM [TABLE] ORDER BY YEAR(date) LIMIT 0,30;下面幾種情況不應該使用索引:
1、order by的字段混合使用asc和desc
select * from ordertable order by col1 desc ,col2 asc;2、where子句使用的字段和order by的字段不一致
select * from ordertable where col1=1 order by col2;3、對不同的關鍵字使用order by排序
select * from ordertable order by col1,col2;優化GROUP BY 語句
使用group by語句時,mysql會對符合的結果自動排序,通過掃描整個表并創建一個新的臨時表,表中每個組的所有行應為連續的,然后使用該臨時表來找到組并應用累計行數。在某些情況下,mysql可以通過索引訪問而不用臨時表。
通過制定order by null可以禁止排序,從而節省耗損。
#沒有優化
explain select id,count(data) from test group by id;#使用order by null優化
explain select id,count(data) from test group by id order by null ;優化嵌套查詢
mysql從4.1版本開始支持子查詢,使用子查詢可進行select語句的嵌套查詢,即一個select查詢的結果作為另一個select語句的條件。執行子查詢時,mysql需要為內層查詢語句的查詢結果建立一個臨時表,然后外層查詢語句從臨時表中查詢記錄,查詢完畢后,在撤銷這些臨時表,因此子查詢速度會受到一定影響。
在mysql中可以使用連接(JOIN)查詢來替代子查詢,連接查詢不需要建立臨時表,其速度比子查詢快,如果查詢中使用索引的話,性能會更好。連接之所以更有效率,是因為mysql不需要在內存中創建臨時表來完成查詢工作。
子查詢:
explain select * from emp where dept_id not in (select id from dept);連接:
explain select * from emp left join dept on emp.dept_id=dept.id where emp.dept_id is null;優化OR語句
對于使用OR條件的子查詢,如果要使用索引,則OR之間的每個條件列都必須使用索引。
explain select * from ortest where data1=2 or data2=3;create index idx_data1 on ortest(data1);create index idx_data2 on ortest(data2);#創建索引后,mysql在處理包含or子查詢中,是對or的各個字段在查詢結果之后在進行UNION操作。
explain select * from ortest where data1=2 or data2=3;平時都是想到哪寫到哪,所以可能會比較雜,大家有什么好的想法可以提一下哦,一起交流
后面會分享更多DBA方面內容,感興趣的朋友可以關注下!
總結
以上是生活随笔為你收集整理的mysql优化的几种方法_详解mysql数据库不同类型sql语句优化方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c code first mysql_C
- 下一篇: php url传递参数_python+R