国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

阿里一面:SQL 優(yōu)化有哪些技巧?

數(shù)據(jù)庫(kù) MySQL
MySQL 為了提升數(shù)據(jù)查詢速率,采用 B+ 樹結(jié)構(gòu),通過(guò)空間換時(shí)間 設(shè)計(jì)思想。另外每次對(duì)表數(shù)據(jù)做更新操作時(shí),都要調(diào)整對(duì)應(yīng)的 索引樹 ,執(zhí)行效率肯定會(huì)受影響。

大家好,我是 Tom哥

MySQL 相信大家一定都不陌生,但是不陌生不一定會(huì)用!

會(huì)用不一定能用好!

今天,Tom哥就帶大家復(fù)習(xí)一個(gè)高頻面試考點(diǎn),SQL 優(yōu)化有哪些技巧?

當(dāng)然這個(gè)還是非常有實(shí)用價(jià)值的,工作中你也一定用的上。如果應(yīng)用得當(dāng),升職加薪,指日可待

1、創(chuàng)建索引

一定要記得創(chuàng)建索引,創(chuàng)建索引,創(chuàng)建索引

重要的事說(shuō)三遍!

執(zhí)行沒有索引的 SQL 語(yǔ)句,肯定要走全表掃描,慢是肯定的。

這種查詢毫無(wú)疑問(wèn)是一個(gè)慢 SQL 查詢。

那么問(wèn)題來(lái)了,是不是要收集所有的 where 查詢條件,然后針對(duì)所有的組合都創(chuàng)建索引呢?

答案肯定是否定的。

MySQL 為了提升數(shù)據(jù)查詢速率,采用 B+ 樹結(jié)構(gòu),通過(guò)空間換時(shí)間 設(shè)計(jì)思想。另外每次對(duì)表數(shù)據(jù)做更新操作時(shí),都要調(diào)整對(duì)應(yīng)的 索引樹 ,執(zhí)行效率肯定會(huì)受影響。

本著二八原則,互聯(lián)網(wǎng)請(qǐng)求讀多寫少的特點(diǎn),我們一定要找到一個(gè)平衡點(diǎn)。

阿里巴巴的開發(fā)者手冊(cè)建議,單表索引數(shù)量控制在5個(gè)以內(nèi),組合索引字段數(shù)不允許超過(guò)5個(gè)

其他建議:

  • 禁止給表中的每一列都建立單獨(dú)的索引
  • 每個(gè)Innodb表必須有個(gè)主鍵
  • 要注意組合索引的字段的順序
  • 優(yōu)先考慮覆蓋索引
  • 避免使用外鍵約束

2、避免索引失效

不要以為有了索引,就萬(wàn)事大吉。

殊不知,索引失效 也是慢查詢的主要原因之一。

常見的索引失效的場(chǎng)景有哪些?

  • 以 % 開頭的 LIKE 查詢。
  • 創(chuàng)建了組合索引,但查詢條件不滿足 '最左匹配原則'。如:創(chuàng)建索引 idx_type_status_uid(type,status,uid),但是使用 status 和 uid 作為查詢條件。
  • 查詢條件中使用 or,且 or 的前后條件中有一個(gè)列沒有索引,涉及的索引都不會(huì)被使用到。
  • 在索引列上的操作,函數(shù) upper()等,or、!= (<>),not in 等。

3、鎖粒度

MySQL 的存儲(chǔ)引擎分為兩大類:MyISAM 和 InnoDB 。

MyISAM 支持表鎖;InnoDB 支持行鎖和表鎖

更新操作時(shí),為了保證表數(shù)據(jù)的準(zhǔn)確性,通常會(huì)加鎖,為了提高系統(tǒng)的高并發(fā)能力,我們通常建議采用 行鎖,減少鎖沖突、鎖等待 的時(shí)間。所以,存儲(chǔ)引擎通常會(huì)選擇 InnoDB

行鎖可能會(huì)升級(jí)為表鎖,有哪些場(chǎng)景呢?

  • 如果一個(gè)表批量更新,大量使用行鎖,可能導(dǎo)致其他事務(wù)長(zhǎng)時(shí)間等待,嚴(yán)重影響事務(wù)的執(zhí)行效率。此時(shí),MySQL會(huì)將 行鎖 升級(jí)為 表鎖
  • 行鎖是針對(duì)索引加的鎖,如果 條件索引失效,那么 行鎖 也會(huì)升級(jí)為 表鎖

注意:行鎖將鎖的粒度縮小了,進(jìn)而提高了系統(tǒng)的并發(fā)能力。但是也有個(gè)弊端,可能會(huì)產(chǎn)生死鎖,需要特別關(guān)注。

4、分頁(yè)查詢優(yōu)化

如果要開發(fā)一個(gè)列表展示頁(yè)面并支持翻頁(yè)時(shí),我們通常會(huì)這樣寫 SQL

select * fromlimit #{start}, #{pageSize};

隨著翻頁(yè)的深度加大, start 值越來(lái)越大,比如:limit 10000 ,10

看似只返回了 10 條數(shù)據(jù),但數(shù)據(jù)庫(kù)引擎需要查詢 10010 條記錄,然后將前面的 10000 條丟棄,最終只返回最后的 10 條記錄,性能可想而知

針對(duì)這個(gè)問(wèn)題,我們通常有另一種解決方案:

先定位到上一次分頁(yè)的最大 id,然后對(duì) id 做條件索引查詢。由于數(shù)據(jù)庫(kù)的索引采用 B+ 樹結(jié)構(gòu),這樣可以一步到位

select * fromwhere id > #{id}  limit  #{pageSize};

任何事情,有利就有弊

這種翻頁(yè)方式只支持 上一頁(yè)、下一頁(yè) ,不支持跨越式直梯翻頁(yè)

上圖是淘寶的商品搜索列表,為了用戶體驗(yàn)更好,采用的也是 直梯式翻頁(yè)。

為了避免翻頁(yè)過(guò)深,影響性能,產(chǎn)品交互上做了一些取舍,對(duì)總頁(yè)數(shù)做了限制,最多支持 100 頁(yè)。

方案二:采用子查詢

select * from 表 where id > ( select id from 表 order by id limit 10000 1) limit 20;

將原來(lái)的單 SQL 查詢拆成兩步:

  • 首先,查詢出 一頁(yè)數(shù)據(jù)中的最小 id
  • 然后,通過(guò) B+ 樹,精確定位到 最小id的索引樹節(jié)點(diǎn)位置,通過(guò) 偏移量 讀取后面的 20條 數(shù)據(jù)

阿里的規(guī)約手冊(cè)也有對(duì)應(yīng)描述:

5、避免 select *

反面案例:

select  * fromwhere buyer_id = #{buyer_id} 

我們知道,MySQL 創(chuàng)建表后,具體的行數(shù)據(jù)存儲(chǔ)在主鍵索引(屬于聚簇索引)的葉子節(jié)點(diǎn)。

二級(jí)索引屬于非聚簇索引,其葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵值

select * 的查詢過(guò)程:

  • 先在 buyer_id 的二級(jí)索引 B+ 樹,查出對(duì)應(yīng)的 主鍵 id 列表
  • 然后進(jìn)行 回表 操作,在 主鍵索引中 查詢 id 對(duì)應(yīng)的行數(shù)據(jù)

所以,我們需要羅列清楚必須的查詢字段,且字段盡量在 覆蓋索引 中,從而減少 回表 操作。

6、EXPLAIN 分析 SQL 執(zhí)行計(jì)劃

授人以魚不如授人以漁

除了知曉常見的不規(guī)范 SQL 寫法,在開發(fā)過(guò)程中,避免踩坑

我們還應(yīng)知道,出現(xiàn)了慢 SQL 該如何排查、優(yōu)化

實(shí)驗(yàn)安排起來(lái)

創(chuàng)建表

CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
`income` bigint(20) NOT NULL COMMENT '收入',
`expend` bigint(20) NOT NULL COMMENT '支出',
PRIMARY KEY (`id`),
KEY `idx_income` (`income`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶表';

CREATE TABLE `biz_order` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
`user_id` bigint(20) NOT NULL COMMENT '用戶id',
`money` bigint(20) NOT NULL COMMENT '金額',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='訂單表';

插入記錄:

insert into user values(10,100,100);
insert into user values(20,200,200);
insert into user values(30,300,300);
insert into user values(40,400,400);

insert into biz_order values(1,10,30);
insert into biz_order values(2,10,40);
insert into biz_order values(3,10,50);
insert into biz_order values(4,20,10);

比如下面的語(yǔ)句,我們看是否使用了索引,可以通過(guò) explain 分析相應(yīng)的執(zhí)行計(jì)劃

explain select * from user where id<20;

接下來(lái),我們來(lái)逐一來(lái)說(shuō)明每個(gè)字段的含義

  • id:每一次 select 查詢都會(huì)生成一個(gè) id,值越大,優(yōu)先級(jí)越高,會(huì)被優(yōu)先執(zhí)行
  • select_type:查詢類型,SIMPLE(普通查詢,即沒有聯(lián)合查詢、子查詢)、PRIMARY(主查詢)、UNION(UNION 中后面的查詢)、SUBQUERY(子查詢)等
  • table:查詢哪張表
  • partitions:分區(qū),如果對(duì)應(yīng)的表存在分區(qū)表,那么這里就會(huì)顯示具體的分區(qū)信息
  • type:執(zhí)行方式,是 SQL 優(yōu)化中一個(gè)很重要的指標(biāo),結(jié)果值從好到差依次是:system > const > eq_ref > ref > range > index > ALL
system/const:表中只有一行數(shù)據(jù)匹配,此時(shí)根據(jù)索引查詢一次就能找到對(duì)應(yīng)的數(shù)據(jù)
eq_ref:使用唯一索引掃描,常見于多表連接中使用主鍵和唯一索引作為關(guān)聯(lián)條件
ref:非唯一索引掃描,還可見于唯一索引最左原則匹配掃描
range:索引范圍掃描,比如,<>,between 等操作
index:索引全表掃描,此時(shí)遍歷整個(gè)索引樹
ALL:表示全表掃描,需要遍歷全表來(lái)找到對(duì)應(yīng)的行
  • possible_keys:可能用到的索引
  • key:實(shí)際用到的索引
  • key_len:索引長(zhǎng)度
  • ref:關(guān)聯(lián) id 等信息
  • rows:查找到記錄所掃描的行數(shù),SQL 優(yōu)化重要指標(biāo),掃描的行數(shù)越少,性能越高
  • filtered:查找到所需記錄占總掃描記錄數(shù)的比例
  • Extra:額外的信息
explain select * from user u , biz_order b where u.id=b.user_id and 
u.id<20;

7、Show Profile 分析 SQL 執(zhí)行性能

Show Profile 與 EXPLAIN 的區(qū)別是,前者主要是在外圍分析;后者則是深入到 MySQL 內(nèi)核,從執(zhí)行線程的狀態(tài)和時(shí)間來(lái)分析。

MySQL 是在 5.0.37 版本之后才支持 Show Profile ,select @@have_profiling 返回 YES 表示功能已開啟。

mysql> show profiles;
Empty set, 1 warning (0.00 sec)

顯示為空,說(shuō)明profiles功能是關(guān)閉的。

通過(guò)下面命令開啟:

mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

獲取 Query_ID 之后,通過(guò) show profile for query ID ,查看 SQL 語(yǔ)句在執(zhí)行過(guò)程中線程的每個(gè)狀態(tài)所消耗的時(shí)間。

責(zé)任編輯:武曉燕 來(lái)源: 微觀技術(shù)
相關(guān)推薦

2022-05-11 15:57:16

優(yōu)化SQL

2025-03-28 08:10:00

Spring自動(dòng)裝配Java

2025-05-22 09:54:06

2022-08-26 17:14:37

HTTP 1.0HTTP 1.1HTTP

2025-05-15 09:45:54

2025-03-24 07:35:00

開發(fā)注解Spring

2019-10-31 13:58:32

阿里電商系統(tǒng)

2024-11-01 06:00:00

2022-04-02 10:52:33

Go開發(fā)面試

2021-01-31 13:39:22

SQL樹搜索操作

2022-05-11 22:15:51

云計(jì)算云平臺(tái)

2023-12-01 09:11:33

大數(shù)據(jù)數(shù)據(jù)庫(kù)

2024-05-15 16:41:57

進(jìn)程IO文件

2024-10-17 16:58:43

2020-09-19 17:46:20

React Hooks開發(fā)函數(shù)

2009-07-30 14:38:36

云計(jì)算

2011-12-23 09:43:15

開源開放

2011-12-22 20:53:40

Android

2025-07-15 03:00:00

2022-01-17 07:59:13

SpringSpringMVCSpringBoot
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

免费人成在线观看网站| 高清国产一区| 亚洲男女一区二区三区| 综合久久一区| 制服丝袜专区在线| 黄动漫在线观看| 青青草久久网络| 久久久亚洲国产天美传媒修理工| 黑丝美女久久久| 国产一区二区三区四| 首页国产精品| 在线高清av| 探花国产精品| 亚洲精品一区二区毛豆| 欧美激情亚洲视频| 欧美日韩久久一区| 91色综合久久久久婷婷| 欧美1级日本1级| 高清欧美日韩| 超鹏97在线| 亚洲精品一二三四五区| eeuss鲁一区二区三区| 97se综合| 亚洲不卡视频| 国产伦精品一区二区三区在线播放| 999福利在线视频| 日韩av中文字幕一区| 精品理论电影在线| 美女视频亚洲色图| 日韩av在线发布| 日韩久久一区二区| 亚洲影视在线播放| 亚洲精品一区二区三区香蕉| 日韩中文字幕网址| 中文欧美在线视频| 日韩手机在线导航| 日韩国产激情在线| 免费精品99久久国产综合精品| 国产原创在线观看| 免费男女羞羞的视频网站主页在线观看 | 亚洲成人黄色在线观看| **孕交吃奶水一级毛片| 久久久久国产精品一区三寸| 久久不卡日韩美女| 成人免费在线电影| 日韩中文字幕二区| 任我爽在线视频精品一| 91在线视频九色| 色综合久久中文字幕综合网小说| 欧美一级专区免费大片| 欧美日韩国产精品一区| 91美女视频网站| 国产精品一区二区果冻传媒| 亚洲一级二级| 天堂日韩电影| 久久91视频| av免费在线观| 全色精品综合影院| av手机天堂| 国产毛片视频网站| 一二三四中文字幕| 亚洲一区中文字幕在线观看| 午夜视频你懂的| 中文在线а√在线8| 欧美理论在线播放| 国产人成亚洲第一网站在线播放| 亚洲成人三区| 一区二区三区日韩在线| 精品51国产黑色丝袜高跟鞋| 国产伦精品一区二区三区免费迷 | 蜜桃久久影院| 最新在线地址| 欧洲一区在线| 久久婷婷亚洲| 欧美性猛交xxxx乱大交3| 在线亚洲高清视频| 日韩免费中文字幕| 国产片侵犯亲女视频播放| 色婷五月综激情亚洲综合| 亚洲a∨精品一区二区三区导航| 欧美激情欧美| 亚洲成人免费视频| 国产精品99久久久久久久久久久久| 色狠狠久久av五月综合|| 日色在线视频| 日韩av网址大全| 国产精品久久久一区麻豆最新章节| 欧美一级欧美三级在线观看| 国产日本欧美一区二区三区在线| 国产素人在线观看| xxxx视频在线| 亚洲国产精品一区| 狠狠色狠色综合曰曰| 欧美精品生活片| 国产精品一二三在线观看| 精品国产白色丝袜高跟鞋| 一区在线视频| 欧美精品久久久久久久多人混战| 精品国产一区二区三区四区vr| 偷拍视频一区二区三区| 性娇小13――14欧美| 午夜激情久久久| 国产麻豆一区二区三区在线观看| 污污网址在线观看| 在线观看操人| 精品一区中文字幕| 欧洲日韩成人av| 一区二区在线视频观看| 欧美精品18+| 欧美视频第一区| 日本成人一区二区| 女女同性女同一区二区三区91| 成人国产精品久久久| 日韩精品久久久| 天天久久夜夜| 久久久久久网站| 九热视频在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 精品国产乱码久久久久久蜜柚| 黑人巨大精品欧美一区二区桃花岛| 色综合激情五月| 福利视频网站| 97se亚洲国产综合自在线观| 日韩精品资源| 国产一区二区观看| 欧美大片免费看| av天在线观看| 免费观看久久久4p| 成人区精品一区二区婷婷| 在线视频国产区| av片在线观看免费| 小早川怜子影音先锋在线观看| 亚洲精品国产精品国产| 国产精品无码久久久久| 久久久精品区| 精品肉辣文txt下载| 日韩激情欧美| 菁菁伊人国产精品| heyzo久久| 欧美激情偷拍| 久久九九99| 国产九色精品成人porny| av电影在线观看一区| 中文字幕精品在线不卡| 亚洲一二三四区不卡| 色哟哟欧美精品| 在线观看91视频| 日韩一二三四区| 国产小视频国产精品| 日韩av色综合| 国产伦精品一区二区三区照片| 日韩aⅴ视频一区二区三区| 黄色a级片免费看| 成人网18免费软件大全| 国产h视频在线观看| 日韩av影片| 日日夜夜精品视频| 永久91嫩草亚洲精品人人| 午夜亚洲性色福利视频| 国产成人精品影视| 亚洲成人av电影| 91麻豆精品国产自产在线观看一区 | 91破解版在线观看| 欧洲亚洲精品久久久久| 亚州国产精品| 麻豆精品视频在线观看免费| 久久久久久久久一| 一本色道久久加勒比精品 | 肉色丝袜一区二区| 99精品国产91久久久久久| 色综合久久久久久久久| 日韩av在线精品| 91地址最新发布| 亚洲一区二区在线看| 人人澡人一摸人人添| 九色在线观看| 日本黄色一区| 日韩精品欧美| 国产精品一品二品| 亚洲精品国产品国语在线app| 欧美一二三区精品| 欧美大片第1页| 久久精精品视频| 蜜桃传媒九九九| 欧美1—12sexvideos| 最新国产精品精品视频| 日韩av在线播放中文字幕| 中文字幕一区二| 亚洲国产精品美女| 成人日韩在线电影| 老子影院午夜伦不卡大全| 免费高清特黄a大片| 国产乱码精品一区二三赶尸艳谈| 菠萝菠萝蜜在线视频免费观看| 欧美二区在线播放| 九九久久婷婷| 午夜cr在线观看高清在线视频完整版| 超碰国产一区| 亚洲人成久久| 亚洲国产成人午夜在线一区|