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