av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MySQL索引失效十種場(chǎng)景與優(yōu)化方案

瀏覽:194日期:2023-05-08 10:17:46
目錄
  • 1 數(shù)據(jù)準(zhǔn)備
    • 1.1 新建數(shù)據(jù)表
    • 1.2 新增100萬(wàn)條數(shù)據(jù)
  • 2 基礎(chǔ)知識(shí)
    • 2.1 explain type
    • 2.2 explain Extra
  • 3 索引失效場(chǎng)景
    • 3.1 查詢類型錯(cuò)誤
      • 3.1.1 失效場(chǎng)景
      • 3.1.2 解決方案
    • 3.2 索引列參與運(yùn)算
      • 3.2.1 失效場(chǎng)景
      • 3.2.2 解決方案
    • 3.3 MySQL放棄使用索引
      • 3.3.1 失效場(chǎng)景
      • 3.3.2 解決方案一
      • 3.3.3 解決方案二
    • 3.4 錯(cuò)誤使用通配符
      • 3.4.1 數(shù)據(jù)準(zhǔn)備
      • 3.4.2 失效場(chǎng)景一
      • 3.4.3 失效場(chǎng)景二
      • 3.4.4 解決方案
    • 3.5 OR連接無(wú)索引字段
      • 3.5.1 失效場(chǎng)景
      • 3.5.2 解決方案
    • 3.6 未用到覆蓋索引
      • 3.6.1 失效場(chǎng)景
      • 3.6.2 解決方案
    • 3.7 聯(lián)合索引失效
      • 3.7.1 完整使用
      • 3.7.2 失效場(chǎng)景一:索引不完整
      • 3.7.3 失效場(chǎng)景二:索引中斷
      • 3.7.4 失效場(chǎng)景三:非等值匹配
      • 3.7.5 失效場(chǎng)景四:最左索引缺失
  • 4 文章總結(jié)

    1 數(shù)據(jù)準(zhǔn)備

    1.1 新建數(shù)據(jù)表

    CREATE TABLE `player` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT "主鍵",  `player_id` varchar(256) NOT NULL COMMENT "運(yùn)動(dòng)員編號(hào)",  `player_name` varchar(256) NOT NULL COMMENT "運(yùn)動(dòng)員名稱",  `height` int(11) NOT NULL COMMENT "身高",  `weight` int(11) NOT NULL COMMENT "體重",  `type` varchar(256) DEFAULT "0" COMMENT "球員類型",  `game_performance` text COMMENT "最近一場(chǎng)比賽表現(xiàn)",  PRIMARY KEY (`id`),  KEY `idx_name_height_weight` (`player_name`,`height`,`weight`),  KEY `idx_type` (`type`),  KEY `idx_height` (`height`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

    以上數(shù)據(jù)表聲明三個(gè)索引:

    • 聯(lián)合索引:idx_name_height_weight
    • 普通索引:idx_type
    • 普通索引:idx_height

    1.2 新增100萬(wàn)條數(shù)據(jù)

    @SpringBootTest(classes = TestApplication.class)@RunWith(SpringJUnit4ClassRunner.class)public class PlayerServiceTest {    @Resource    private PlayerRepository playerRepository;    @Test    public void initBigData() {for (int i = 0; i < 1000000; i++) {    PlayerEntity entity = new PlayerEntity();    entity.setPlayerId(UUID.randomUUID().toString());    entity.setPlayerName("球員_" + System.currentTimeMillis());    entity.setType("0");    entity.setWeight(150);    entity.setHeight(188);    entity.setGamePerformance("{\"runDistance\":8900.0,\"passSuccess\":80.12,\"scoreNum\":3}");    playerRepository.insert(entity);}    }}

    2 基礎(chǔ)知識(shí)

    2.1 explain type

    執(zhí)行計(jì)劃中訪問(wèn)類型是重要分析指標(biāo):

    2.2 explain Extra

    Extra表示執(zhí)行計(jì)劃擴(kuò)展信息:

    3 索引失效場(chǎng)景

    本章節(jié)介紹索引失效十種場(chǎng)景:

    • 查詢類型錯(cuò)誤
    • 索引列參與運(yùn)算
    • 錯(cuò)誤使用通配符
    • 未用到覆蓋索引
    • OR連接無(wú)索引字段
    • MySQL放棄使用索引
    • 聯(lián)合索引失效
      • 索引不完整
      • 索引中斷
      • 非等值匹配
      • 最左索引缺失

    3.1 查詢類型錯(cuò)誤

    3.1.1 失效場(chǎng)景

    explain select * from player where type = 0

    3.1.2 解決方案

    數(shù)據(jù)表定義type字段為varchar類型,查詢必須使用相同類型:

    3.2 索引列參與運(yùn)算

    3.2.1 失效場(chǎng)景

    explain select * from player where height + 1 > 189

    3.2.2 解決方案

    explain select * from player where height > 188

    3.3 MySQL放棄使用索引

    3.3.1 失效場(chǎng)景

    MySQL發(fā)現(xiàn)如果使用索引性能低于全表掃描則放棄使用索引。例如在表中100萬(wàn)條數(shù)據(jù)height字段值全部是188,所以執(zhí)行如下語(yǔ)句時(shí)放棄使用索引:

    explain select * from player where height > 187

    3.3.2 解決方案一

    調(diào)整查詢條件值:

    explain select * from player where height > 188

    3.3.3 解決方案二

    強(qiáng)制指定索引,這種方法不一定可以提升性能:

    3.4 錯(cuò)誤使用通配符

    3.4.1 數(shù)據(jù)準(zhǔn)備

    避免出現(xiàn)3.3章節(jié)失效問(wèn)題此處修改一條數(shù)據(jù):

    update player set player_name = "測(cè)試球員" where id = 1

    3.4.2 失效場(chǎng)景一

    explain select * from player where player_name like "%測(cè)試"

    3.4.3 失效場(chǎng)景二

    explain select * from player where player_name like "%測(cè)試%"

    3.4.4 解決方案

    explain select * from player where player_name like "測(cè)試%"

    3.5 OR連接無(wú)索引字段

    3.5.1 失效場(chǎng)景

    type有索引,weight無(wú)索引:

    explain select * from player where type = "0" or weight = 150

    3.5.2 解決方案

    weight新增索引,union拼裝查詢數(shù)據(jù)

    explainselect * from player where type = "0" unionselect * from player where weight = 150

    3.6 未用到覆蓋索引

    3.6.1 失效場(chǎng)景

    Using index condition表示使用索引,但是需要回表查詢

    explain select * from player where player_name like "測(cè)試%"

    3.6.2 解決方案

    覆蓋索引含義是查詢時(shí)索引列完全包含查詢列,查詢過(guò)程無(wú)須回表(需要在同一棵索引樹)性能得到提升。Using Index; Using where表示使用覆蓋索引并且用where過(guò)濾查詢結(jié)果:

    explain select id,player_name,height,weight from player where player_name like "測(cè)試%"

    3.7 聯(lián)合索引失效

    3.7.1 完整使用

    聯(lián)合索引idx_name_height_weight完整使用key_len=778:

    explain select * from player where player_name = "球員_1682577684751" and height = 188 and weight = 150

    3.7.2 失效場(chǎng)景一:索引不完整

    weight不在查詢條件,所以只用到idx_name_height,所以key_len= 774:

    explain select * from player where player_name = "球員_1682577684751" and height = 188

    3.7.3 失效場(chǎng)景二:索引中斷

    height不在查詢條件,所以只用到idx_name,所以key_len= 770:

    explain select * from player where player_name = "球員_1682577684751" and weight = 150

    3.7.4 失效場(chǎng)景三:非等值匹配

    height非等值匹配,所以只用到idx_name_height,所以key_length=774:

    explain select * from player where player_name="球員_1682577684751" and height > 188 and weight = 150

    3.7.5 失效場(chǎng)景四:最左索引缺失

    player_name最左索引不在查詢條件,全表掃描

    explain select * from player where weight = 150

    4 文章總結(jié)

    本文第一進(jìn)行測(cè)試數(shù)據(jù)準(zhǔn)備,第二介紹執(zhí)行計(jì)劃相關(guān)知識(shí),第三介紹索引失效10種場(chǎng)景:查詢類型錯(cuò)誤,索引列參與運(yùn)算,錯(cuò)誤使用通配符,未用到覆蓋索引,OR連接無(wú)索引字段,MySQL放棄使用索引,聯(lián)合索引中索引不完整,索引中斷,非等值匹配,最左索引缺失。

    以上就是MySQL索引失效十種場(chǎng)景與優(yōu)化方案的詳細(xì)內(nèi)容,更多關(guān)于MySQL索引失效的資料請(qǐng)關(guān)注其它相關(guān)文章!

    標(biāo)簽: MySQL
    相關(guān)文章:
    主站蜘蛛池模板: 欧美日韩亚洲视频 | 国产乱肥老妇国产一区二 | 亚洲精品日韩精品 | 欧美性生活网 | 久久中文免费视频 | 91国内在线观看 | 日韩成人在线观看 | 亚洲精品免费观看 | 中国一级特黄真人毛片 | 国产午夜精品一区二区三区在线观看 | 国产精品国产三级国产aⅴ中文 | 久久久久久久电影 | 酒色成人网 | 狠狠干综合视频 | 国产成人叼嘿视频在线观看 | 精品一区二区久久久久久久网站 | 看真人视频一级毛片 | 国内精品久久久久久影视8 最新黄色在线观看 | 99久久日韩精品免费热麻豆美女 | 国产人成精品一区二区三 | 日韩欧美一二三区 | 男人的天堂一级片 | 日韩天堂av | 成人精品视频 | 日韩精品一区二区三区 | 国产福利在线 | 男人的天堂久久 | 亚洲精品电影在线观看 | 人人做人人澡人人爽欧美 | 91精品国产91久久久久久丝袜 | 自拍偷拍亚洲一区 | 麻豆一区二区三区精品视频 | 国产女人与拘做受免费视频 | 欧美日一区| 色婷婷精品国产一区二区三区 | 视频1区 | 国产午夜精品视频 | 成人精品一区二区户外勾搭野战 | 一区日韩| 欧美黄色大片在线观看 | 福利网址 |