新聞中心
MySQL 是目前世界上更流行的數(shù)據(jù)庫(kù)之一,它具有可靠、穩(wěn)定、易用等優(yōu)點(diǎn)。但是在實(shí)際應(yīng)用中,MySQL 數(shù)據(jù)庫(kù)的性能往往受到不少限制,其中最為核心和重要的就是訪問(wèn)速度。如何優(yōu)化 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)速度,成為了很多開發(fā)者和 DBA 面臨的重要問(wèn)題。

優(yōu)化 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)速度,可以從以下幾個(gè)方面來(lái)考慮:
一、優(yōu)化索引
索引是 MySQL 數(shù)據(jù)庫(kù)中查詢速度非常重要的因素之一。在優(yōu)化索引的時(shí)候,主要有以下幾個(gè)方法:
1. 對(duì)經(jīng)常使用的列進(jìn)行索引
索引會(huì)增加表的大小,減少更新的速度,因此對(duì)于不常用的列不需要進(jìn)行索引。而對(duì)于經(jīng)常使用的列,如主鍵和用于搜索和排序的列,則需要進(jìn)行索引。
2. 聯(lián)合索引
對(duì)于經(jīng)常同時(shí)作為搜索條件的兩列,就可以將它們合并成一個(gè)聯(lián)合索引,以提高查詢速度。
3. 優(yōu)化索引類型
索引類型也會(huì)影響查詢速度,MySQL 支持多種索引類型,如 Btree、Hash、Fulltext 等。在選擇索引類型時(shí)需要考慮到查詢的具體情況。
二、優(yōu)化 SQL 查詢語(yǔ)句
優(yōu)化 SQL 查詢語(yǔ)句也是優(yōu)化 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)速度的重要因素之一。主要有以下幾個(gè)方法:
1. 避免使用通配符查詢
通配符查詢(如%和_)會(huì)導(dǎo)致 MySQL 引擎進(jìn)行全表掃描,降低查詢速度。如果能夠使用具體的搜索條件,則應(yīng)該避免使用通配符查詢。
2. 避免在查詢語(yǔ)句中使用函數(shù)
函數(shù)會(huì)導(dǎo)致 MySQL 引擎進(jìn)行計(jì)算,降低查詢速度。如果需要使用函數(shù),則應(yīng)盡量將其從查詢語(yǔ)句中分離出來(lái)。
3. 使用合適的連接方式
在進(jìn)行多表聯(lián)合查詢時(shí),使用合適的連接方式可以提高查詢速度。INNER JOIN 速度最快,但只返回有匹配數(shù)據(jù)的行,LEFT JOIN 和 RIGHT JOIN 則可以返回所有行。
三、使用索引查詢范圍過(guò)濾
如果查詢結(jié)果集很大,而索引卻很小,那么使用索引查詢可能不劃算,因?yàn)?MySQL 引擎可能會(huì)選擇全表掃描。這時(shí)可以使用索引查詢范圍過(guò)濾,即指定查詢范圍,以提高查詢速度。
四、優(yōu)化緩存
MySQL 數(shù)據(jù)庫(kù)通過(guò)緩存機(jī)制來(lái)提高查詢速度。緩存技術(shù)可以在一定程度上解決查詢結(jié)果集過(guò)大的問(wèn)題。主要有以下幾個(gè)方法:
1. 適時(shí)清空緩存
如果 MySQL 數(shù)據(jù)庫(kù)中的數(shù)據(jù)經(jīng)常發(fā)生變化,那么使用緩存機(jī)制可能會(huì)導(dǎo)致緩存過(guò)期,從而影響查詢速度。因此需要適時(shí)清空緩存。
2. 合理設(shè)置緩存大小
緩存大小設(shè)置得過(guò)大會(huì)導(dǎo)致內(nèi)存耗盡,而設(shè)置得太小會(huì)導(dǎo)致緩存頻繁失效,降低查詢速度。因此需要進(jìn)行合理的緩存大小設(shè)置。
3. 使用緩存替換
緩存替換可以有效地減少緩存失效的情況,提高查詢速度。常用的緩存替換技術(shù)有 LRU(最近最少使用)和 LFU(最不經(jīng)常使用)。
五、適時(shí)優(yōu)化硬件環(huán)境
適時(shí)優(yōu)化硬件環(huán)境是優(yōu)化 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)速度的關(guān)鍵因素之一。主要有以下幾個(gè)方法:
1. 使用高性能的服務(wù)器
使用高性能的服務(wù)器可以提高 MySQL 數(shù)據(jù)庫(kù)的訪問(wèn)速度,減少阻塞和等待時(shí)間,增加并發(fā)性。
2. 增加硬盤容量和速度
增加硬盤容量和速度可以降低 I/O 延遲,提高查詢速度,并且能夠存儲(chǔ)更多的數(shù)據(jù),更好地支持業(yè)務(wù)需求。
3. 增加內(nèi)存
增加內(nèi)存可以提高緩存能力,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),增加并發(fā)性能。
以上就是優(yōu)化 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)速度的幾個(gè)重要方面。雖然我們不能保證每種優(yōu)化方式都能完全成功,但在實(shí)際使用中,可以根據(jù)自己的業(yè)務(wù)情況,適時(shí)選擇優(yōu)化方法,不斷調(diào)整和完善,以達(dá)到更大程度的提高 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)速度的目的。
相關(guān)問(wèn)題拓展閱讀:
- mysql數(shù)據(jù)量上十萬(wàn)條后,查詢慢導(dǎo)致服務(wù)器卡有什么解決辦法
mysql數(shù)據(jù)量上十萬(wàn)條后,查詢慢導(dǎo)致服務(wù)器卡有什么解決辦法
問(wèn)題
我們納搭腔有一個(gè) SQL,用于找到?jīng)]有
主鍵
/ 唯一鍵的表,但是在 MySQL 5.7 上運(yùn)行特別慢,怎么辦?
實(shí)驗(yàn)
我們搭建一個(gè) MySQL 5.7 的環(huán)境,此處省略搭建步驟。
寫個(gè)簡(jiǎn)單的腳本,制造一批帶主鍵和不帶主鍵的表:
執(zhí)行一下腳本:
現(xiàn)在執(zhí)行以下 SQL 看看效果:
…
執(zhí)行了 16.80s,感覺是非常慢了。
現(xiàn)在用一下 DBA
三板斧
,看看執(zhí)行計(jì)劃:
感覺有點(diǎn)慘,由于 information_schema.columns 是元數(shù)據(jù)表,沒有必要的統(tǒng)計(jì)信息。
那我們來(lái) show warnings 看看 MySQL 改寫后的 SQL:
我們格式化一下 SQL:
可以看到 MySQL 將
select from A where A.x not in (select x from B) //非關(guān)聯(lián)子查詢
轉(zhuǎn)換成了
select from A where not exists (select 1 from B where B.x = a.x) //關(guān)聯(lián)子查詢
如果我們自己是 MySQL,在執(zhí)行非關(guān)聯(lián)子查詢時(shí),可以使用很簡(jiǎn)單的策略:
select from A where A.x not in (select x from B where …) //非關(guān)聯(lián)子查詢:1. 掃描 B 表中的所有記錄,找到洞衫滿足條件的記錄,存放在臨時(shí)表 C 中,建好索引2. 掃描 A 表中的記錄,與臨時(shí)表 C 中的記錄進(jìn)行比對(duì),直接在索引里比對(duì),
而關(guān)聯(lián)子查詢就需要循環(huán)迭代:
select from A where not exists (select 1 from B where B.x = a.x and …) //關(guān)聯(lián)子查詢掃描 A 表的每一條記錄 rA: 掃描 B 表,找到其中的之一條滿足 rA 條件的記錄。
顯然,關(guān)聯(lián)子查詢的掃描成本會(huì)高于非關(guān)聯(lián)子查詢。
我們希望 MySQL 能先”緩存”子查詢的結(jié)果(緩存這一步叫物化,MATERIALIZATION),但MySQL 認(rèn)為不緩存更快,我們就需要枝襲給予 MySQL 一定指導(dǎo)。
…
可以看到執(zhí)行時(shí)間變成了 0.67s。
整理
我們?cè)\斷的關(guān)鍵點(diǎn)如下:
\1. 對(duì)于 information_schema 中的元數(shù)據(jù)表,執(zhí)行計(jì)劃不能提供有效信息。
\2. 通過(guò)查看 MySQL 改寫后的 SQL,我們猜測(cè)了優(yōu)化器發(fā)生了誤判。
\3. 我們?cè)黾恿?hint,指導(dǎo) MySQL 正確進(jìn)行優(yōu)化判斷。
但目前我們的實(shí)驗(yàn)僅限于猜測(cè),猜中了萬(wàn)事大吉,猜不中就無(wú)法做出好的診斷。
幾面:
硬件軟件及語(yǔ)言
硬件抗住
軟件mysql沒設(shè)置數(shù)據(jù)庫(kù)設(shè)計(jì)面等
語(yǔ)言SQL語(yǔ)句寫
面些優(yōu)化技巧
1.查詢進(jìn)行優(yōu)化應(yīng)盡量避免全表掃描首先應(yīng)考慮 where 及 order by 涉及列祥皮建立索引
2.應(yīng)盡量避免 where 句字段進(jìn)行 null 值判斷否則導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where num is nullnum設(shè)置默認(rèn)值0確保表num列沒null值查詢:select id from t where num=0
3.應(yīng)盡量避免 where 句使用!=或>操作符否則引擎放棄使用索引進(jìn)行全表掃描
4.應(yīng)盡量避免 where 句使用or 連接條件否則導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where num=10 or num=20查詢:select id from t where num=10 union all select id from t where num=20
5.in not in 要慎用否則導(dǎo)致全表掃描:select id from t where num in(1,2,3) 于連續(xù)數(shù)值能用 between 要用 in :select id from t where num between 1 and 3
6.面查詢導(dǎo)致全表掃描:select id from t where name like ‘李%’若要提高效率考慮全文檢索
7.
where
句使用參數(shù)導(dǎo)致全表掃描SQL運(yùn)行才解析局部變量?jī)?yōu)化程序能訪問(wèn)計(jì)劃選擇推遲運(yùn)行;必須編譯進(jìn)行選擇
編譯建立訪問(wèn)計(jì)劃變量值未知作索引選擇輸入項(xiàng)面語(yǔ)句鋒友進(jìn)行全表掃描:select id from t where num=@num改強(qiáng)制查詢使用索引:select id from t with(index(索引名)) where num=@num
8.應(yīng)盡量避免 where 句字段進(jìn)行表達(dá)式操作導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where num/2=100應(yīng)改:select id from t where num=100*2
9.應(yīng)盡量避免where句字段進(jìn)行函數(shù)銀宴槐操作導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where substring(name,1,3)=’abc’ nameabcid
應(yīng)改:
select id from t where name like ‘a(chǎn)bc%’
10.要 where 句=左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其表達(dá)式運(yùn)算否則系統(tǒng)能確使用索引
11.使用索引字段作條件該索引復(fù)合索引必須使用該索引第字段作條件才能保證系統(tǒng)使用該索引否則該索引使用并且應(yīng)盡能讓字段順序與索引順序相致
12.要寫些沒意義查詢需要空表結(jié)構(gòu):select col1,col2 into #t from t where 1=0
類代碼返任何結(jié)集消耗系統(tǒng)資源應(yīng)改:
create table #t(…)
13.候用 exists 代替 in 選擇:select num from a where num in(select num from b)
用面語(yǔ)句替換:
select num from a where exists(select 1 from b where num=a.num)
14.并所索引查詢都效SQL根據(jù)表數(shù)據(jù)進(jìn)行查詢優(yōu)化索引列量數(shù)據(jù)重復(fù)SQL查詢能利用索引表字段sexmale、female幾乎各半即使sex建索引查詢效率起作用
15.
索引并越越索引固 提高相應(yīng) select 效率同降低 insert 及 update 效率 insert
或 update
能重建索引所建索引需要慎重考慮視具體情況定表索引數(shù)要超6若太則應(yīng)考慮些使用列建索引否
必要
16.
應(yīng)盡能避免更新 clustered 索引數(shù)據(jù)列 clustered
索引數(shù)據(jù)列順序表記錄物理存儲(chǔ)順序旦該列值改變導(dǎo)致整表記錄順序調(diào)整耗費(fèi)相資源若應(yīng)用系統(tǒng)需要頻繁更新
clustered 索引數(shù)據(jù)列需要考慮否應(yīng)該索引建 clustered 索引
17.盡量使用數(shù)字型字段若含數(shù)值信息字段盡量要設(shè)計(jì)字符型降低查詢連接性能并增加存儲(chǔ)銷引擎處理查詢連接逐比較字符串每字符于數(shù)字型言需要比較夠
18.盡能使用 varchar/nvarchar 代替 char/nchar 首先變字段存儲(chǔ)空間節(jié)省存儲(chǔ)空間其于查詢說(shuō)相較字段內(nèi)搜索效率顯要高些
19.任何都要使用 select * from t 用具體字段列表代替*要返用任何字段
20.盡量使用表變量代替臨表表變量包含量數(shù)據(jù)請(qǐng)注意索引非限(主鍵索引)
21.避免頻繁創(chuàng)建刪除臨表減少系統(tǒng)表資源消耗
22.臨表并使用適使用使某些例程更效例需要重復(fù)引用型表或用表某數(shù)據(jù)集于性事件使用導(dǎo)表
23.新建臨表性插入數(shù)據(jù)量使用 select into 代替 create table避免造量 log 提高速度;數(shù)據(jù)量緩系統(tǒng)表資源應(yīng)先create tableinsert
24.使用臨表存儲(chǔ)程務(wù)必所臨表顯式刪除先 truncate table drop table 避免系統(tǒng)表較間鎖定
25.盡量避免使用游標(biāo)游標(biāo)效率較差游標(biāo)操作數(shù)據(jù)超1萬(wàn)行應(yīng)該考慮改寫
26.使用基于游標(biāo)或臨表前應(yīng)先尋找基于集解決案解決問(wèn)題基于集通更效
27.
與臨表游標(biāo)并使 用型數(shù)據(jù)集使用 FAST_FORWARD
游標(biāo)通要優(yōu)于其逐行處理尤其必須引用幾表才能獲所需數(shù)據(jù)結(jié)集包括合計(jì)例程通要比使用游標(biāo)執(zhí)行速度快發(fā)
間允許基于游標(biāo)基于集都嘗試看哪種效更
28.所存儲(chǔ)程觸發(fā)器始處設(shè)置 SET NOCOUNT ON 結(jié)束設(shè)置 SET NOCOUNT OFF 需執(zhí)行存儲(chǔ)程觸發(fā)器每語(yǔ)句向客戶端發(fā)送DONE_IN_PROC 消息
29.盡量避免事務(wù)操作提高系統(tǒng)并發(fā)能力
30.盡量避免向客戶端返數(shù)據(jù)量若數(shù)據(jù)量應(yīng)該考慮相應(yīng)需求否合理
建索引啊,如果是全文搜索,做分詞索引,速度就很快了
關(guān)于mysql 數(shù)據(jù)庫(kù)訪問(wèn)慢的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營(yíng)銷公司
成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站維護(hù),網(wǎng)絡(luò)營(yíng)銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務(wù)。IDC基礎(chǔ)服務(wù):云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、服務(wù)器租用、服務(wù)器托管提供四川、成都、綿陽(yáng)、雅安、重慶、貴州、昆明、鄭州、湖北十堰機(jī)房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)。
網(wǎng)站欄目:如何優(yōu)化 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)速度? (mysql 數(shù)據(jù)庫(kù)訪問(wèn)慢)
文章URL:http://m.fisionsoft.com.cn/article/cdegsgo.html


咨詢
建站咨詢
