国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

查詢效率至少提高4倍的MySQL技巧

這篇具有很好參考價(jià)值的文章主要介紹了查詢效率至少提高4倍的MySQL技巧。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

  • SQL語句中IN包含的值不應(yīng)過多

MySQL對于IN做了相應(yīng)的優(yōu)化,即將IN中的常量全部存儲(chǔ)在一個(gè)數(shù)組里面,而且這個(gè)數(shù)組是排好序的。但是如果數(shù)值較多,產(chǎn)生的消耗也是比較大的。再例如:select id from t where num in(1,2,3) 對于連續(xù)的數(shù)值,能用between就不要用in了;再或者使用連接來替換。

  • SELECT語句務(wù)必指明字段名稱

SELECT*增加很多不必要的消耗(CPU、IO、內(nèi)存、網(wǎng)絡(luò)帶寬);增加了使用覆蓋索引的可能性;當(dāng)表結(jié)構(gòu)發(fā)生改變時(shí),前斷也需要更新。所以要求直接在select后面接上字段名。

  • 當(dāng)只需要一條數(shù)據(jù)的時(shí)候,使用limit 1

這是為了使EXPLAIN中type列達(dá)到const類型

  • 如果排序字段沒有用到索引,就盡量少排序

  • 如果限制條件中其他字段沒有索引,盡量少用or

or兩邊的字段中,如果有一個(gè)不是索引字段,而其他條件也不是索引字段,會(huì)造成該查詢不走索引的情況。很多時(shí)候使用union all或者是union(必要的時(shí)候)的方式來代替“or”會(huì)得到更好的效果。

  • 盡量用union all 代替 union

union和union all的差異主要是前者需要將結(jié)果集合并后再進(jìn)行唯一性過濾操作,這就會(huì)涉及到排序,增加大量的CPU運(yùn)算,加大資源消耗及延遲。當(dāng)然,union all的前提條件是兩個(gè)結(jié)果集沒有重復(fù)數(shù)據(jù)。

  • 不使用ORDER BY RAND()
SELECT
	id 
FROM
	`dynamic` 
ORDER BY
	rand( ) 
	LIMIT 1000;

上面的SQL語句,可優(yōu)化為:

SELECT
	id 
FROM
	`dynamic` t1
	JOIN ( SELECT rand( ) * ( SELECT max( id ) FROM `dynamic` ) AS nid ) t2 ON t1.id > t2.nid 
	LIMIT 1000;
  • 區(qū)分in和exists、not in和not exists
SELECT
	* 
FROM
	表 A 
WHERE
	id IN ( SELECT id FROM 表 B )

上面SQL語句相當(dāng)于

SELECT
	* 
FROM
	表 A 
WHERE
	EXISTS ( SELECT * FROM 表 B WHERE 表 B.id =表 A.id )

區(qū)分in和exists主要是造成了驅(qū)動(dòng)順序的改變(這是性能變化的關(guān)鍵),如果是exists,那么以外層表為驅(qū)動(dòng)表,先被訪問,如果是IN,那么先執(zhí)行子查詢。所以IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況。

關(guān)于not in和not exists,推薦使用not exists,不僅僅是效率問題,not in可能存在邏輯問題。如何高效的寫出一個(gè)替代not exists的SQL語句?

原SQL語句:

SELECT
	colname … 
FROM
	A表 
WHERE
	a.id NOT IN (
SELECT
	b.id 
FROM
	B表)

高效的SQL語句:

SELECT
	colname … 
FROM
	A表
	LEFT JOIN B表 ON 
WHERE
	a.id = b.id 
WHERE
	b.id IS NULL
  • 使用合理的分頁方式以提高分頁的效率
SELECT
	id,
NAME 
FROM
	product 
	LIMIT 866613,
	20

使用上述SQL語句做分頁的時(shí)候,可能有人會(huì)發(fā)現(xiàn),隨著表數(shù)據(jù)量的增加,直接使用limit分頁查詢會(huì)越來越慢。

優(yōu)化的方法如下:可以取前一頁的最大行數(shù)的id,然后根據(jù)這個(gè)最大的id來限制下一頁的起點(diǎn)。比如此列中,上一頁最大的id是866612。SQL可以采用如下的寫法:

SELECT
	id,
NAME 
FROM
	product 
WHERE
	id > 866612 
	LIMIT 20
  • 分段查詢

在一些用戶選擇頁面中,可能一些用戶選擇的時(shí)間范圍過大,造成查詢緩慢。主要的原因是掃描行數(shù)過多。這個(gè)時(shí)候可以通過程序,分段進(jìn)行查詢,循環(huán)遍歷,將結(jié)果合并處理進(jìn)行展示。

如下圖這個(gè)SQL語句,掃描的行數(shù)成百萬級以上的時(shí)候就可以使用分段查詢:

  • 避免在where子句中對字段進(jìn)行null值判斷

對于null的判斷會(huì)導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。

  • 不建議使用%前綴模糊查詢

例如LIKE“%name”或者LIKE“%name%”,這種查詢會(huì)導(dǎo)致索引失效而進(jìn)行全表掃描。但是可以使用LIKE “name%”。

那如何查詢%name%?

如下圖所示,雖然給secret字段添加了索引,但在explain結(jié)果并沒有使用:

那么如何解決這個(gè)問題呢,答案:使用全文索引。

在我們查詢中經(jīng)常會(huì)用到select id,fnum,fdst from dynamic_201606 where user_name like ‘%zhangsan%’; 。這樣的語句,普通索引是無法滿足查詢需求的。慶幸的是在MySQL中,有全文索引來幫助我們。

創(chuàng)建全文索引的SQL語法是:

ALTER TABLE `dynamic_201606` ADD FULLTEXT INDEX `idx_user_name` ( `user_name` );

使用全文索引的SQL語句是:

selectid,fnum,fdstfromdynamic_201606wherematch(user_name) against('zhangsan’inboolean mode);

注意:在需要?jiǎng)?chuàng)建全文索引之前,請聯(lián)系DBA確定能否創(chuàng)建。同時(shí)需要注意的是查詢語句的寫法與普通索引的區(qū)別。

  • 避免在where子句中對字段進(jìn)行表達(dá)式操作

比如:

SELECT
	user_id,
	user_project 
FROM
	user_base 
WHERE
	age * 2 = 36;

中對字段就行了算術(shù)運(yùn)算,這會(huì)造成引擎放棄使用索引,建議改成:

SELECT
	user_id,
	user_project 
FROM
	user_base 
WHERE
	age = 36 / 2;
  • 避免隱式類型轉(zhuǎn)換

where子句中出現(xiàn)column字段的類型和傳入的參數(shù)類型不一致的時(shí)候發(fā)生的類型轉(zhuǎn)換,建議先確定where中的參數(shù)類型。

16、對于聯(lián)合索引來說,要遵守最左前綴法則

舉列來說索引含有字段id、name、school,可以直接用id字段,也可以id、name這樣的順序,但是name;school都無法使用這個(gè)索引。所以在創(chuàng)建聯(lián)合索引的時(shí)候一定要注意索引字段順序,常用的查詢字段放在最前面。

  • 必要時(shí)可以使用force index來強(qiáng)制查詢走某個(gè)索引

有的時(shí)候MySQL優(yōu)化器采取它認(rèn)為合適的索引來檢索SQL語句,但是可能它所采用的索引并不是我們想要的。這時(shí)就可以采用forceindex來強(qiáng)制優(yōu)化器使用我們制定的索引。

  • 注意范圍查詢語句

對于聯(lián)合索引來說,如果存在范圍查詢,比如between、>、< 等條件時(shí),會(huì)造成后面的索引字段失效。

  • 關(guān)于JOIN優(yōu)化

LEFT JOIN A表為驅(qū)動(dòng)表,INNER JOIN MySQL會(huì)自動(dòng)找出那個(gè)數(shù)據(jù)少的表作用驅(qū)動(dòng)表,RIGHT JOIN B表為驅(qū)動(dòng)表。

注意:

1)MySQL中沒有full join,可以用以下方式來解決:

SELECT
	user_id,
	user_project 
FROM
	user_base 
WHERE
	age = 36 / 2;

2)盡量使用inner join,避免left join:

參與聯(lián)合查詢的表至少為2張表,一般都存在大小之分。如果連接方式是inner join,在沒有其他過濾條件的情況下MySQL會(huì)自動(dòng)選擇小表作為驅(qū)動(dòng)表,但是left join在驅(qū)動(dòng)表的選擇上遵循的是左邊驅(qū)動(dòng)右邊的原則,即left join左邊的表名為驅(qū)動(dòng)表。

3)合理利用索引:

被驅(qū)動(dòng)表的索引字段作為on的限制字段。

4)利用小表去驅(qū)動(dòng)大表:

從原理圖能夠直觀的看出如果能夠減少驅(qū)動(dòng)表的話,減少嵌套循環(huán)中的循環(huán)次數(shù),以減少 IO總量及CPU運(yùn)算的次數(shù)。

5)巧用STRAIGHT_JOIN:

inner join是由MySQL選擇驅(qū)動(dòng)表,但是有些特殊情況需要選擇另個(gè)表作為驅(qū)動(dòng)表,比如有g(shù)roup by、order by等「Using filesort」、「Using temporary」時(shí)。STRAIGHT_JOIN來強(qiáng)制連接順序,在STRAIGHT_JOIN左邊的表名就是驅(qū)動(dòng)表,右邊則是被驅(qū)動(dòng)表。在使用STRAIGHT_JOIN有個(gè)前提條件是該查詢是內(nèi)連接,也就是inner join。其他鏈接不推薦使用STRAIGHT_JOIN,否則可能造成查詢結(jié)果不準(zhǔn)確。

這個(gè)方式有時(shí)能減少3倍的時(shí)間。

以上MySQL優(yōu)化方法希望對大家有所幫助!文章來源地址http://www.zghlxwxcb.cn/news/detail-858322.html

到了這里,關(guān)于查詢效率至少提高4倍的MySQL技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用MySQL存儲(chǔ)過程提高數(shù)據(jù)庫效率和可維護(hù)性

    使用MySQL存儲(chǔ)過程提高數(shù)據(jù)庫效率和可維護(hù)性

    MySQL 存儲(chǔ)過程是一種強(qiáng)大的數(shù)據(jù)庫功能,它允許你在數(shù)據(jù)庫中存儲(chǔ)和執(zhí)行一組SQL語句,類似于編程中的函數(shù)。存儲(chǔ)過程可以大幅提高數(shù)據(jù)庫的性能、安全性和可維護(hù)性。本文將詳細(xì)介紹MySQL存儲(chǔ)過程的使用。 MySQL存儲(chǔ)過程是一組預(yù)編譯的SQL語句,它們以一個(gè)名稱存儲(chǔ)在數(shù)據(jù)庫

    2024年02月08日
    瀏覽(22)
  • IntelliJ IDEA無公網(wǎng)遠(yuǎn)程連接Windows本地Mysql數(shù)據(jù)庫提高開發(fā)效率

    IntelliJ IDEA無公網(wǎng)遠(yuǎn)程連接Windows本地Mysql數(shù)據(jù)庫提高開發(fā)效率

    ?? 博客主頁 : 小羊失眠啦. ?? 系列專欄 : 《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 《Linux》 《Cpolar》 ?? 感謝大家點(diǎn)贊??收藏?評論?? 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。 IDEA作為Java開發(fā)最主力的工具,在

    2024年02月05日
    瀏覽(22)
  • MySQL數(shù)據(jù)庫索引優(yōu)化指南:提升查詢效率的利器

    MySQL數(shù)據(jù)庫索引優(yōu)化指南:提升查詢效率的利器

    本文將詳細(xì)探討MySQL數(shù)據(jù)庫索引的概念、作用以及不同類型的索引,包括主鍵索引、唯一索引和普通索引。通過實(shí)際案例分析,我們將深入理解索引的工作原理,并提供實(shí)用的優(yōu)化建議,幫助讀者提升數(shù)據(jù)庫性能。

    2024年02月09日
    瀏覽(123)
  • SpringBoot引入緩存提高單次查詢數(shù)據(jù)效率

    第1步:引入緩存上下文 第2步:查詢先查緩存,查詢到值先存緩存 第3步:清理緩存上下文 第4步:驗(yàn)證使用 執(zhí)行日志

    2024年02月20日
    瀏覽(14)
  • SQL CREATE INDEX 語句- 提高數(shù)據(jù)庫檢索效率的關(guān)鍵步驟

    SQL CREATE INDEX 語句用于在表中創(chuàng)建索引。 索引用于比其他方式更快地從數(shù)據(jù)庫中檢索數(shù)據(jù)。用戶無法看到索引,它們只是用于加速搜索/查詢。 注意: 使用索引更新表比不使用索引更新表需要更多的時(shí)間(因?yàn)樗饕残枰拢?。因此,只在?jīng)常進(jìn)行搜索的列上創(chuàng)建索引。

    2024年02月05日
    瀏覽(25)
  • 為業(yè)務(wù)數(shù)據(jù)庫注入低代碼智能:提高開發(fā)效率與靈活性的關(guān)鍵實(shí)踐

    為業(yè)務(wù)數(shù)據(jù)庫注入低代碼智能:提高開發(fā)效率與靈活性的關(guān)鍵實(shí)踐

    隨著公司試圖減少工作量并讓他們的業(yè)務(wù)上線,很明顯,大多數(shù)產(chǎn)品創(chuàng)意和功能需求都可以通過以最少的手動(dòng)編碼構(gòu)建的可立即運(yùn)行但可定制的應(yīng)用程序進(jìn)行分類。借助迎合公民開發(fā)人員的低代碼開發(fā)平臺(tái),低代碼開發(fā)成為過度勞累的 IT 部門新的具有成本效益的速贏方法。

    2024年02月20日
    瀏覽(20)
  • es 在數(shù)據(jù)量很大的情況下(數(shù)十億級別)如何提高查詢效率?_es能存多少數(shù)據(jù)

    es 在數(shù)據(jù)量很大的情況下(數(shù)十億級別)如何提高查詢效率?_es能存多少數(shù)據(jù)

    先自我介紹一下,小編浙江大學(xué)畢業(yè),去過華為、字節(jié)跳動(dòng)等大廠,目前阿里P7 深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長,但自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前! 因此收集整理了一份《2024年最新軟件測試全套學(xué)習(xí)資料》

    2024年04月26日
    瀏覽(36)
  • MySQL表操作:提高數(shù)據(jù)處理效率的秘訣(進(jìn)階)(1)

    MySQL表操作:提高數(shù)據(jù)處理效率的秘訣(進(jìn)階)(1)

    ??**“生命不在于相信奇跡,而在于創(chuàng)造奇跡?!薄鞂W(xué)恒**?? ??作者:不能再留遺憾了?? ??專欄:MySQL學(xué)習(xí)?? ??本文章主要內(nèi)容:MySQL對表操作進(jìn)階。數(shù)據(jù)庫約束、表的設(shè)計(jì)、新增,后續(xù)會(huì)更新進(jìn)階表的查詢?? 前面我們已經(jīng)介紹過初識(shí)MySQL以及MySQL對庫和對表操作(

    2024年02月08日
    瀏覽(19)
  • MySQL表操作:提高數(shù)據(jù)處理效率的秘訣(進(jìn)階)(2)

    MySQL表操作:提高數(shù)據(jù)處理效率的秘訣(進(jìn)階)(2)

    ??“學(xué)習(xí)難免有坎坷,重要的是你能盡力而為,持之以恒?!?? ??作者:不能再留遺憾了?? ??專欄:MySQL學(xué)習(xí)?? ??本文章主要內(nèi)容:MySQL表操作進(jìn)階:聚合查詢和聯(lián)合查詢?? 前面我們學(xué)習(xí)了MySQL進(jìn)階的數(shù)據(jù)庫約束、表的設(shè)計(jì)和新增,那么今天我將為大家分享MySQL表查詢

    2024年02月08日
    瀏覽(20)
  • 互聯(lián)網(wǎng)大廠技術(shù)-elasticsearch(es)- 在數(shù)據(jù)量很大的情況下(數(shù)十億級別)提高查詢效率

    互聯(lián)網(wǎng)大廠技術(shù)-elasticsearch(es)- 在數(shù)據(jù)量很大的情況下(數(shù)十億級別)提高查詢效率

    互聯(lián)網(wǎng)大廠技術(shù)-elasticsearch(es)- 在數(shù)據(jù)量很大的情況下(數(shù)十億級別)提高查詢效率 目錄 一、問題分析 二、問題剖析 三、性能優(yōu)化的殺手锏(filesystem cache) 四、數(shù)據(jù)預(yù)熱 五、冷熱分離 六、document 模型設(shè)計(jì) 七、分頁性能優(yōu)化 八、解決方案 這個(gè)問題是肯定要問的,說白了,就

    2024年02月04日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包