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

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化

這篇具有很好參考價(jià)值的文章主要介紹了MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化

前面我們講解了索引的存儲(chǔ)結(jié)構(gòu),B+Tree的索引結(jié)構(gòu),以及索引最左側(cè)匹配原則,Explain的用法,可以看到是否使用了索引,今天我們講解一下SQL語句的優(yōu)化及如何優(yōu)化

1.表結(jié)構(gòu)

新建表結(jié)構(gòu) user, user_info

#新建表結(jié)構(gòu) user
CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `id_card` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '身份證ID',
  `user_name` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用戶名字',
  `age` int NOT NULL COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用戶表'
  1. id 主鍵id列
  2. id_card 身份證id
  3. user_name 用戶姓名
  4. age 年齡

先插入測(cè)試數(shù)據(jù), 插入 5條測(cè)試數(shù)據(jù)

INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (1, '11', 'aa', 10);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (2, '22', 'bb', 20);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (3, '33', 'cc', 30);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (4, '44', 'dd', 40);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (5, '55', 'ee', 50);
2 where語句及order的列 建立索引

表結(jié)構(gòu)先不創(chuàng)建索引,我們看下執(zhí)行分析
EXPLAIN SELECT * FROM user WHERE user_name=“AA”;

EXPLAIN SELECT * FROM `user` WHERE user_name="AA";

執(zhí)行成功, type=ALL表示沒有索引,查詢效率低下
MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

我們?cè)?user_name上建立索引后,再看下

#創(chuàng)建索引
alter  table `user` add index `idx_name`(`user_name`);

#執(zhí)行分析
EXPLAIN SELECT * FROM `user` WHERE user_name="AA";

使用了索引,查詢效率提升
MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

3. where語句不要使用!=,<>

where語句中使用!= 或者 <>, 或者使用 between and 都會(huì)是引擎放棄索引,進(jìn)行全表掃描

我們新建 age的索引,然后基于age去做查詢分析

#創(chuàng)建age索引
alter  table `user` add index `idx_age`(`age`);
#執(zhí)行分析
EXPLAIN SELECT * FROM `user` WHERE age=10;

使用age索引進(jìn)行查詢,沒有問題
MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析
現(xiàn)在我們使用 != 或者 <> 來進(jìn)行查詢,執(zhí)行查詢分析

EXPLAIN SELECT * FROM `user` WHERE age !=10;
EXPLAIN SELECT * FROM `user` WHERE age <>10;
EXPLAIN SELECT * FROM `user` WHERE age BETWEEN 10 and 20;
EXPLAIN SELECT * FROM `user` WHERE age > 10 and age < 20 ;

執(zhí)行結(jié)果全都是 type=range 表示在索引范圍內(nèi)查找,對(duì)索引的掃描開始于某一點(diǎn),返回匹配值域的行, 已經(jīng)不是ref類型了,效率已經(jīng)不高了
Extra 其他信息= using index condition 表示會(huì)先條件過濾索引,過濾完索引后找到所有符合索引條件的數(shù)據(jù)行,隨后用 WHERE 子句中的其他條件去過濾這些數(shù)據(jù)行;
using index condition = using index + 回表 + where 過濾
MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

4.where語句不要or進(jìn)行判斷

where語句使用or判斷,也會(huì)導(dǎo)致引擎放棄索引,進(jìn)而進(jìn)行全表掃描
使用 or, 也會(huì)造成 type=range的情況

EXPLAIN SELECT * FROM `user` WHERE age =10 or age =20;

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析
這種情況,我們可以采用 union all 來進(jìn)行優(yōu)化

EXPLAIN SELECT * FROM `user` WHERE age =10 union all  SELECT * FROM `user` WHERE age =20 ;

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

5.where語句不要使用 like模糊查詢

like模糊查詢,也會(huì)導(dǎo)致 全表掃描

#1.左側(cè)開頭精確匹配,右側(cè)結(jié)果模糊
EXPLAIN SELECT * FROM `user` WHERE user_name like "a%";
#2.左側(cè)開頭模糊,右側(cè)結(jié)果精確匹配
EXPLAIN SELECT * FROM `user` WHERE user_name like "%a";
#3.左側(cè)開頭模糊,右側(cè)結(jié)果模糊
EXPLAIN SELECT * FROM `user` WHERE user_name like "%a%";

上面3種情況,我們來逐一分析

  1. 左側(cè)開頭精確匹配,右側(cè)結(jié)果模糊, 查詢會(huì)使用左側(cè)索引進(jìn)行匹配,type=range
EXPLAIN SELECT * FROM `user` WHERE user_name like "a%";

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析
2. 左側(cè)開頭模糊,右側(cè)結(jié)果精確匹配, 查詢不會(huì)使用索引,全表掃描 type=ALL

EXPLAIN SELECT * FROM `user` WHERE user_name like "%a";

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析
3. 左側(cè)開頭模糊,右側(cè)結(jié)果模糊, 查詢不會(huì)使用索引,全表掃描 type=ALL

EXPLAIN SELECT * FROM `user` WHERE user_name like "%a%";

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

6.where語句 不要 in 和not in, 可能也會(huì)導(dǎo)致全表掃描

where子語句,使用 in,not in 也有可能導(dǎo)致全表掃描

所以使用in 到底走不走索引呢?

  • in通常是走索引的
  • IN 的條件過多,會(huì)導(dǎo)致索引失效,走索引掃描
  • 當(dāng)in后面的數(shù)據(jù)在數(shù)據(jù)表中超過一定的數(shù)量 (有人說是30%,假如上面的例子的全部數(shù)據(jù)大約100條,匹配數(shù)據(jù)超過30條 ),會(huì)走全表掃描,即不走索引
  • in走不走索引和后面的數(shù)據(jù)有關(guān)系,這個(gè)比例不準(zhǔn)

我表中5條數(shù)據(jù), 我現(xiàn)在 in(10,20,30,40), in了4條,但是依舊走了索引 type=range, key=idx_age

EXPLAIN SELECT * FROM `user` WHERE age in(10,20,30,40);

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

我現(xiàn)在再加一個(gè)in條件 in(10,20,30,40,50), 此刻就沒有走索引, type=ALL

EXPLAIN SELECT * FROM `user` WHERE age in(10,20,30,40,50);

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

但是 not in 是肯定不走索引的,這是我們明確禁止的

EXPLAIN SELECT * FROM `user` WHERE age not in(1,2);

MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析

7.where語句不要使用表達(dá)式計(jì)算及函數(shù)運(yùn)算

where子句,不要使用表達(dá)式計(jì)算或者函數(shù)運(yùn)算,這回導(dǎo)致全表掃描

EXPLAIN SELECT * FROM `user` WHERE age / 2 =10;
EXPLAIN SELECT * FROM `user` WHERE SUBSTRING(user_name,1,3)="aa";

執(zhí)行結(jié)果全部都是 type=ALL,使用表達(dá)式計(jì)算和函數(shù)的 都不會(huì)使用索引
MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化,Mysql實(shí)戰(zhàn),mysql,Explain SQL優(yōu)化,SQL語句分析優(yōu)化,SQL分析,慢sql分析


至此,我們了解如何去優(yōu)化查詢語句,在平時(shí)項(xiàng)目中,也應(yīng)該多注意這些用法,防止出現(xiàn)線上事故文章來源地址http://www.zghlxwxcb.cn/news/detail-722365.html

到了這里,關(guān)于MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動(dòng)表上

    MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動(dòng)表上

    Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動(dòng)表上 前面我們講解了B+Tree的索引結(jié)構(gòu),也詳細(xì)講解下 left Join的底層驅(qū)動(dòng)表 選擇原理,那么今天我們來看看到底如何用以及如何建立索引和索引優(yōu)化 開始之前我們先提一個(gè)問題, 為什么索引要建立在被驅(qū)動(dòng)表上 ? 1.建表及測(cè)試數(shù)據(jù) 我們先

    2024年02月08日
    瀏覽(43)
  • MySQL索引3——Explain關(guān)鍵字和索引優(yōu)化(SQL提示、索引失效、索引使用規(guī)則)

    MySQL索引3——Explain關(guān)鍵字和索引優(yōu)化(SQL提示、索引失效、索引使用規(guī)則)

    目錄 Explain 索引性能分析 Id ——select的查詢序列號(hào) Select_type——select查詢的類型 Table——表名稱 Type——select的連接類型 Possible_key ——顯示可能應(yīng)用在這張表的索引 Key——實(shí)際用到的索引 Key_len——實(shí)際索引使用到的字節(jié)數(shù) Ref??? ——索引命中的列或常量 Rows——預(yù)

    2024年02月14日
    瀏覽(48)
  • [MySQL]SQL優(yōu)化之sql語句優(yōu)化

    [MySQL]SQL優(yōu)化之sql語句優(yōu)化

    ??鍵盤敲爛,年薪30萬?? 目錄 一、索引優(yōu)化 回顧: ??索引分類: ??索引失效: ??設(shè)計(jì)原則: ??SQL性能分析 二、SQL優(yōu)化 語句優(yōu)化 ?? insert語句: ?? 主鍵優(yōu)化: ?? order by優(yōu)化: ?? group by優(yōu)化: ?? limit 優(yōu)化 ?? count 優(yōu)化 ?? update 優(yōu)化? ??索引分類: 一般分類:主

    2024年02月04日
    瀏覽(24)
  • MySQL 參考文檔:SQL 語句優(yōu)化(SELECT 語句優(yōu)化)之索引條件下推(索引下推)優(yōu)化

    索引下推優(yōu)化官方文檔說明 (Section 8.2.1.5):https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html 1. 什么是索引下推? qquad 索引條件下推 (Index Condition Pushdown,ICP) 是 MySQL 在使用索引從表中檢索行時(shí)的一種優(yōu)化方法。在沒有 ICP 的情況下,存儲(chǔ)引擎遍歷索引以定位基

    2024年02月16日
    瀏覽(26)
  • MySQL性能優(yōu)化之(explain)工具

    MySQL性能優(yōu)化之(explain)工具

    在MySQL當(dāng)中,我們有時(shí)候?qū)懙腟QL執(zhí)行效率太慢此時(shí)我們需要將其優(yōu)化。但是SQL可能非常的多,難道我們一條一條的進(jìn)行查看嗎?在MySQL當(dāng)當(dāng)中我們可以查看慢查詢?nèi)罩?,看看那些SQL這么慢。但是這個(gè)默認(rèn)情況下這個(gè)慢查詢?nèi)罩臼顷P(guān)閉的,我們可以通過一下命令進(jìn)行查看 執(zhí)行結(jié)

    2024年02月02日
    瀏覽(30)
  • MYSQL實(shí)戰(zhàn)45講筆記--基礎(chǔ)架構(gòu):一條SQL查詢語句是如何執(zhí)行的?

    MYSQL實(shí)戰(zhàn)45講筆記--基礎(chǔ)架構(gòu):一條SQL查詢語句是如何執(zhí)行的?

    MySQL 可以分為 Server 層和存儲(chǔ)引擎層兩部分。 Server 層 :連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,涵蓋 MySQL 的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時(shí)間、數(shù)學(xué)和加密函數(shù)等),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),比如存儲(chǔ)過程、觸發(fā)器、視圖等

    2024年02月07日
    瀏覽(23)
  • MySQL實(shí)戰(zhàn):SQL優(yōu)化及問題排查

    MySQL實(shí)戰(zhàn):SQL優(yōu)化及問題排查

    MySQL在選取索引時(shí),會(huì)參考索引的基數(shù),基數(shù)是MySQL估算的,反映這個(gè)字段有多少種取值,估算的策略為選取幾個(gè)頁算出取值的平均值,再乘以頁數(shù),即為基數(shù) 查看索引基數(shù) 使用force index可以強(qiáng)制使用索引 重新統(tǒng)計(jì)索引信息,會(huì)重新計(jì)算索引的基數(shù) count(非索引字段):無法使

    2024年03月10日
    瀏覽(17)
  • Mysql 學(xué)習(xí)(十 二)查詢優(yōu)化 Explain

    Mysql 學(xué)習(xí)(十 二)查詢優(yōu)化 Explain

    一條查詢語句經(jīng)過Mysql查詢優(yōu)化器的各種基于成本和規(guī)則的優(yōu)化后生成一個(gè)所謂的執(zhí)行計(jì)劃,而Explain 語句可以讓我們知道執(zhí)行計(jì)劃的語法,從而我們有針對(duì)性的提升性能 舉例子: EXPLAIN SELECT 1 由此我們得到了一些參數(shù),而這些參數(shù)我們可以知道我們這個(gè)執(zhí)行計(jì)劃做了那些優(yōu)

    2024年02月05日
    瀏覽(36)
  • MySql 性能優(yōu)化神器之 explain 詳解

    MySql 性能優(yōu)化神器之 explain 詳解

    目錄 一. 前言 二. explain 詳解 2.1. 概念 2.2. 數(shù)據(jù)準(zhǔn)備 2.3. id 2.3.1.?id 相同,執(zhí)行順序由上至下 2.3.2.?id 不同,數(shù)字越大優(yōu)先級(jí)越高 2.3.3.?id 存在相同的和不同的 2.4. select_type 2.5. table 2.6. partitions 2.7. type 2.7.1. system 2.7.2.?const 2.7.3.?eq_ref 2.7.4. ref 2.7.5.?fulltext 2.7.6.?ref_or_null 2.7.7.?

    2024年02月03日
    瀏覽(24)
  • 【MYSQL高級(jí)】Mysql的SQL性能分析【借助EXPLAIN分析】

    【MYSQL高級(jí)】Mysql的SQL性能分析【借助EXPLAIN分析】

    要說sql有問題,需要拿出證據(jù),因此需要性能分析 Mysql中有專門負(fù)責(zé)優(yōu)化SELECT語句的優(yōu)化器模塊,主要功能:通過計(jì)算分析系統(tǒng)中收集到的統(tǒng)計(jì)信息,為客戶端請(qǐng)求的Query提供他認(rèn)為最優(yōu)的執(zhí)行計(jì)劃(它認(rèn)為最優(yōu)的數(shù)據(jù)檢索方式,不見得是DBA認(rèn)為是最優(yōu)的,這部分最耗費(fèi)時(shí)間,

    2024年02月15日
    瀏覽(98)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包