最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql如何優(yōu)化查詢速度

 更新時(shí)間:2023年08月30日 08:48:16   作者:哇~是小菜呀  
這篇文章主要介紹了Mysql如何優(yōu)化查詢速度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

對(duì)于需要排序的字段使用索引

當(dāng)查詢結(jié)果需要order by的時(shí)候,可以在order by 的字段加上索引,因?yàn)樗饕呀?jīng)排列好順序了,

所以可以更快的完成排序,而不需要每次對(duì)查詢結(jié)果進(jìn)行排序,耗費(fèi)大量?jī)?nèi)存和時(shí)間。

盡量使用union all 而不是union

除非確實(shí)需要服務(wù)器消除重復(fù)的行,否則一定要使用union all,因此沒(méi)有all關(guān)鍵字,

mysql會(huì)在查詢的時(shí)候給臨時(shí)表加上distinct的關(guān)鍵字,這個(gè)操作的代價(jià)很高。

exists 和 join如何選擇

join

需要多張表進(jìn)行連接,并且需要查詢的字段不是來(lái)自一張表的,比如a.name,b.dept 這種情況需要使用join

exists

要查詢的字段都在a表,但是有一個(gè)很復(fù)雜的條件,可以使用exists子句來(lái)描述后面復(fù)雜的查詢條件

現(xiàn)實(shí)情況中,exists用的比較少,大家都想不起來(lái)用哈哈哈哈

and優(yōu)先級(jí)高于or

比如一個(gè)查詢,需要篩選名字為AAA,并且年齡為20或者21的數(shù)據(jù),

sql語(yǔ)句如下:

select * from tab_a where name = 'AAA' and age = 20 or age = 21;

查詢結(jié)果會(huì)變?yōu)?/p>

name = ‘AAA’ and age = 20的數(shù)據(jù)和

age=21的數(shù)據(jù),查詢結(jié)果錯(cuò)誤。

需要改造sql語(yǔ)句如下:

select * from tab_a where name = 'AAA' and (age=20 or age=21)

盡量不要join超過(guò)三張表

單表索引控制在5個(gè)以內(nèi)

索引越多,b+樹(shù)越大,會(huì)影響插入、刪除效率

組合索引的字段不能超過(guò)5個(gè)

key(a,b,c,d,e)不宜過(guò)多,由于最左匹配原則,如果查詢的列在右邊,那個(gè)查詢的時(shí)候需要補(bǔ)充前幾列的條件

并且,索引的長(zhǎng)度過(guò)長(zhǎng)會(huì)使b+樹(shù)偏大,消耗存儲(chǔ)空間

limit優(yōu)化

limit語(yǔ)法如下:

從第一行開(kāi)始返回,返回前n條數(shù)據(jù)

select * from tab_a order by a limit n

從第m行數(shù)據(jù)開(kāi)始返回,返回后面的n條數(shù)據(jù)

select * from tab_a order by a limit m,n;

例如,如果要查詢tab_a表的第3頁(yè),每頁(yè)10條數(shù)據(jù),可以如下進(jìn)行:

select * from tab_a order by a limit 20,10;

limit相當(dāng)于是一個(gè)指針,在遍歷完前面的數(shù)據(jù)之后,找到需要的數(shù)據(jù),再返回給用戶,如果數(shù)據(jù)量非常大時(shí),例如limit(25000,20),會(huì)掃描全表,limit效率會(huì)變得非常低,

這種情況的調(diào)優(yōu)方式如下:

使用索引列子查詢進(jìn)行調(diào)優(yōu)

調(diào)優(yōu)前:

select film_id,description from film order by title limit 50,5

調(diào)優(yōu)后:

explain select film.film_id,film.description from film inner join (select film_id from film order by title limit 1500,5) as lim using(film_id);

調(diào)優(yōu)后,避免了limit指針掃描全表獲取數(shù)據(jù),而是先使用主鍵id進(jìn)行查詢,id在查詢時(shí),

只會(huì)使用b+樹(shù)去訪問(wèn)到數(shù)據(jù),不需要對(duì)整張表進(jìn)行io,

速度更快,并且不需要回表,再將查詢結(jié)果和主表做join,返回?cái)?shù)據(jù)。

避免向數(shù)據(jù)庫(kù)查詢不必要的數(shù)據(jù)

數(shù)據(jù)庫(kù)服務(wù)層會(huì)查詢所有的結(jié)果,形成結(jié)果集,獲取前面n條數(shù)據(jù)后關(guān)閉結(jié)果集,為了避免形成不必要的結(jié)果集,可以使用limit提升速率例如:

select * from tab_a where id = 'sdasafdf676d8' limit 1;

避免使用select *

如果需要不斷的重復(fù)查詢,使用redis進(jìn)行緩存

盡量使用關(guān)聯(lián)代替子查詢

因?yàn)樽硬樵冊(cè)趫?zhí)行的過(guò)程中會(huì)將子查詢結(jié)果放到臨時(shí)表,增加了io,對(duì)內(nèi)存的開(kāi)銷(xiāo)較大,而join可以利用join buffer進(jìn)行快速匹配,運(yùn)行速度較快。

group by, distinct, order by 時(shí)推薦使用索引列

使用自定義變量

什么是自定義變量?

set @one: = 1;
set @current_actor: = select actor_id from actor order by last_update desc limit 1 ;
set @last_week :=current_date-interval 1 week;
-- 使用如下
select count(1) from actor where last_update < @last_week;
select * from message where actor_id = @current_actor;

自定義變量使用場(chǎng)景:

優(yōu)化排序

set @rownum:= 0;
select actor_id,@rownum:=@rownum+1 as rownum from actor limit 10;

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL?數(shù)據(jù)庫(kù)的對(duì)庫(kù)的操作及其數(shù)據(jù)類(lèi)型

    MySQL?數(shù)據(jù)庫(kù)的對(duì)庫(kù)的操作及其數(shù)據(jù)類(lèi)型

    這篇文章主要介紹了MySQL?數(shù)據(jù)庫(kù)的對(duì)庫(kù)的操作及其數(shù)據(jù)類(lèi)型,下面文字圍繞數(shù)據(jù)庫(kù)的對(duì)庫(kù)的操作及其數(shù)據(jù)類(lèi)型的相關(guān)資料展開(kāi)詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2021-12-12
  • mysql jdbc連接步驟及常見(jiàn)參數(shù)

    mysql jdbc連接步驟及常見(jiàn)參數(shù)

    這篇文章主要介紹了mysql jdbc連接步驟及常見(jiàn)參數(shù),需要的朋友可以參考下
    2015-09-09
  • MySQL修改賬號(hào)密碼方法大全(小結(jié))

    MySQL修改賬號(hào)密碼方法大全(小結(jié))

    這篇文章主要介紹了MySQL修改賬號(hào)密碼方法大全(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • mysql正則函數(shù)REGEXP使用及說(shuō)明

    mysql正則函數(shù)REGEXP使用及說(shuō)明

    本文介紹了MySQL中的正則表達(dá)式匹配操作符REGEXP及其在不同版本中的使用方法和差異,包括基本語(yǔ)法、支持的元字符與量詞、版本差異及常用函數(shù)如REGEXP_LIKE、REGEXP_SUBSTR、REGEXP_REPLACE等
    2026-05-05
  • MYSQL必知必會(huì)讀書(shū)筆記第三章之顯示數(shù)據(jù)庫(kù)

    MYSQL必知必會(huì)讀書(shū)筆記第三章之顯示數(shù)據(jù)庫(kù)

    MySQL是一種開(kāi)放源代碼的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),MySQL數(shù)據(jù)庫(kù)系統(tǒng)使用最常用的數(shù)據(jù)庫(kù)管理語(yǔ)言--結(jié)構(gòu)化查詢語(yǔ)言(SQL)進(jìn)行數(shù)據(jù)庫(kù)管理。接下來(lái)通過(guò)本文給大家介紹MYSQL必知必會(huì)讀書(shū)筆記第三章之顯示數(shù)據(jù)庫(kù),感興趣的朋友參考下吧
    2016-05-05
  • MySQL指令進(jìn)行分頁(yè)顯示的使用示例

    MySQL指令進(jìn)行分頁(yè)顯示的使用示例

    本文主要介紹了MySQL指令進(jìn)行分頁(yè)顯示的使用示例,主要使用LIMIT命令來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • MySQL8.0新特性之不可見(jiàn)主鍵的使用

    MySQL8.0新特性之不可見(jiàn)主鍵的使用

    MySQL8.0.30版本引入不可見(jiàn)主鍵,它可以自動(dòng)為沒(méi)有顯式指定主鍵的?InnoDB?表創(chuàng)建一個(gè)不可見(jiàn)的主鍵,本文主要介紹了MySQL8.0新特性之不可見(jiàn)主鍵的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • mysql之explain使用詳解(分析索引)

    mysql之explain使用詳解(分析索引)

    在這里對(duì)explain的各個(gè)字段進(jìn)行詳細(xì)的分析,來(lái)幫助大家分析自己所寫(xiě)的sql是否最佳的使用了索引,需要的朋友可以參考下
    2018-01-01
  • mysql binlog(二進(jìn)制日志)查看方法

    mysql binlog(二進(jìn)制日志)查看方法

    在本篇文章里小編給大家分享了關(guān)于mysql binlog(二進(jìn)制日志)查看方法,有需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • 聊聊MySQL的COUNT(*)的性能

    聊聊MySQL的COUNT(*)的性能

    這篇文章主要介紹了聊聊MySQL的COUNT(*)的性能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論

文安县| 绍兴县| 上杭县| 屏东县| 济宁市| 斗六市| 德阳市| 常宁市| 彭泽县| 浦东新区| 汝南县| 万荣县| 司法| 泾川县| 西林县| 石阡县| 上高县| 高雄县| 柳江县| 灌南县| 信宜市| 观塘区| 额尔古纳市| 祥云县| 玛纳斯县| 合山市| 丰宁| 巴林右旗| 奉节县| 冀州市| 孟村| 昌吉市| 隆尧县| 保亭| 长白| 莎车县| 大厂| 霸州市| 托克逊县| 康平县| 石屏县|