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

MySQL索引選擇與失效場景全解析

 更新時(shí)間:2025年06月19日 09:42:01   作者:北辰alk  
在MySQL數(shù)據(jù)庫中,索引是一種重要的優(yōu)化手段,它能夠顯著提升查詢速度,尤其是在大數(shù)據(jù)量的表中,然而,如果不正確地使用,索引可能會(huì)失去作用,導(dǎo)致查詢性能下降,所以本文給大家介紹了MySQL索引選擇與失效場景全解析,需要的朋友可以參考下

一、適合建立索引的字段特征

1.1 高選擇性的字段

選擇性公式

選擇性 = 不重復(fù)的值數(shù)量(DISTINCT) / 總記錄數(shù)

選擇性越接近1,索引效果越好

示例分析

-- 查看字段選擇性
SELECT 
  COUNT(DISTINCT gender)/COUNT(*) AS gender_selectivity,
  COUNT(DISTINCT phone)/COUNT(*) AS phone_selectivity
FROM users;

1.2 常用查詢條件的字段

查詢類型索引效果示例
WHERE條件★★★WHERE user_id = 1001
JOIN條件★★★ON a.order_id = b.id
排序字段★★ORDER BY create_time DESC
分組字段★★GROUP BY department

1.3 具體推薦場景

1.3.1 應(yīng)當(dāng)建索引的字段

  • 主鍵和外鍵字段(自動(dòng)創(chuàng)建)
  • 高頻查詢的WHERE條件字段
  • 多表JOIN的關(guān)聯(lián)字段
  • 排序和分組字段(特別是組合排序)
  • 區(qū)分度高的狀態(tài)字段(如訂單狀態(tài))

1.3.2 數(shù)值類型優(yōu)先

-- 好的索引字段
ALTER TABLE products ADD INDEX idx_category_id (category_id);  -- 整型
ALTER TABLE users ADD INDEX idx_phone (phone);  -- 定長字符串

-- 較差的索引選擇
ALTER TABLE logs ADD INDEX idx_content (content(255));  -- 長文本前綴索引

二、索引失效的8大常見場景

2.1 違反最左前綴原則

聯(lián)合索引結(jié)構(gòu)示例

ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);

失效案例

-- 有效使用索引
EXPLAIN SELECT * FROM orders WHERE user_id = 1001 AND status = 1;

-- 部分失效(只用到了user_id)
EXPLAIN SELECT * FROM orders WHERE user_id = 1001;

-- 完全失效(跳過了user_id)
EXPLAIN SELECT * FROM orders WHERE status = 1;

2.2 對索引列使用函數(shù)或運(yùn)算

失效示例

-- 索引失效
EXPLAIN SELECT * FROM users WHERE DATE(create_time) = '2023-01-01';
EXPLAIN SELECT * FROM products WHERE price + 100 > 500;

-- 優(yōu)化方案
EXPLAIN SELECT * FROM users 
WHERE create_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-01 23:59:59';

2.3 隱式類型轉(zhuǎn)換

常見陷阱

-- phone字段是varchar類型
EXPLAIN SELECT * FROM users WHERE phone = 13800138000;  -- 失效
EXPLAIN SELECT * FROM users WHERE phone = '13800138000';  -- 有效

-- 枚舉值比較
EXPLAIN SELECT * FROM orders WHERE status = '1';  -- 可能失效
EXPLAIN SELECT * FROM orders WHERE status = 1;    -- 有效

2.4 使用不等于(!=或<>)

失效分析

-- 索引失效
EXPLAIN SELECT * FROM users WHERE age != 30;

-- 優(yōu)化方案(范圍查詢+union)
EXPLAIN SELECT * FROM users WHERE age < 30 
UNION ALL 
SELECT * FROM users WHERE age > 30;

2.5 LIKE以通配符開頭

對比示例

-- 索引失效
EXPLAIN SELECT * FROM users WHERE name LIKE '%張%';

-- 索引有效(前綴匹配)
EXPLAIN SELECT * FROM users WHERE name LIKE '張%';

-- 特殊優(yōu)化方案(全文索引)
ALTER TABLE users ADD FULLTEXT INDEX ft_idx_name (name);
EXPLAIN SELECT * FROM users WHERE MATCH(name) AGAINST('張*' IN BOOLEAN MODE);

2.6 OR條件使用不當(dāng)

失效場景

-- 索引失效(其中一個(gè)條件無索引)
EXPLAIN SELECT * FROM users WHERE user_id = 1001 OR register_ip = '192.168.1.1';

-- 優(yōu)化方案
EXPLAIN SELECT * FROM users WHERE user_id = 1001
UNION ALL
SELECT * FROM users WHERE register_ip = '192.168.1.1' AND user_id != 1001;

2.7 數(shù)據(jù)分布不均勻

案例演示

-- 當(dāng)status=1占90%數(shù)據(jù)時(shí)
EXPLAIN SELECT * FROM orders WHERE status = 1;  -- 可能全表掃描

-- 查看數(shù)據(jù)分布
SELECT status, COUNT(*) FROM orders GROUP BY status;

2.8 索引列參與IS NULL判斷

特殊情況

-- MySQL 5.7+可以走索引
EXPLAIN SELECT * FROM users WHERE phone IS NULL;

-- 通常需要結(jié)合其他條件
EXPLAIN SELECT * FROM users WHERE phone IS NULL AND create_time > '2023-01-01';

三、高級(jí)索引失效場景

3.1 索引合并導(dǎo)致的性能問題

-- 可能不如預(yù)期高效
EXPLAIN SELECT * FROM users 
WHERE username = 'admin' OR email = 'admin@example.com';

-- 優(yōu)化方案
CREATE INDEX idx_username_email ON users(username, email);

3.2 范圍查詢后的索引失效

-- 只有user_id和status能用索引,age失效
EXPLAIN SELECT * FROM orders 
WHERE user_id = 1001 AND status > 0 AND age = 30;

-- 優(yōu)化索引順序
ALTER TABLE orders ADD INDEX idx_user_age_status (user_id, age, status);

3.3 不同字符集比較

-- 不同字符集比較導(dǎo)致失效
EXPLAIN SELECT * FROM users u JOIN logs l 
ON u.username = l.operator 
WHERE u.charset = 'utf8mb4' AND l.charset = 'latin1';

四、索引使用最佳實(shí)踐

4.1 索引設(shè)計(jì)黃金法則

三星索引原則

  • 一星:WHERE條件列是索引前綴
  • 二星:ORDER BY/GROUP BY列在索引中
  • 三星:SELECT列被索引覆蓋

索引維護(hù)成本

  • 寫操作需要更新索引
  • 每個(gè)表最佳索引數(shù)通常為3-5個(gè)

4.2 實(shí)戰(zhàn)案例解析

電商系統(tǒng)優(yōu)化

-- 原始查詢
SELECT product_id, product_name, price 
FROM products 
WHERE category_id = 5 
AND status = 1 
AND stock > 0 
ORDER BY sales_volume DESC 
LIMIT 20;

-- 優(yōu)化方案
ALTER TABLE products ADD INDEX idx_cat_status_stock_sales 
(category_id, status, stock, sales_volume DESC);

4.3 監(jiān)控與調(diào)優(yōu)工具

索引使用分析

-- 查看未使用的索引
SELECT * FROM sys.schema_unused_indexes;

-- 索引統(tǒng)計(jì)信息
SHOW INDEX FROM products;

-- 查詢性能分析
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 1001;

五、MySQL 8.0索引新特性

5.1 倒序索引

ALTER TABLE orders ADD INDEX idx_create_time (create_time DESC);

5.2 隱藏索引

-- 測試刪除索引的影響
ALTER TABLE users ALTER INDEX idx_email INVISIBLE;
ALTER TABLE users ALTER INDEX idx_email VISIBLE;

5.3 函數(shù)索引

-- 對JSON字段建立索引
ALTER TABLE products ADD INDEX idx_price_data ((CAST(price_data->'$.price' AS DECIMAL(10,2))));

六、總結(jié)與決策流程圖

6.1 索引創(chuàng)建決策流程

6.2 索引失效排查清單

  • 檢查EXPLAIN執(zhí)行計(jì)劃
  • 驗(yàn)證SQL是否遵循最左前綴原則
  • 檢查是否有隱式類型轉(zhuǎn)換
  • 排查是否使用了函數(shù)或運(yùn)算
  • 分析數(shù)據(jù)分布情況
  • 確認(rèn)字符集和排序規(guī)則一致性

通過系統(tǒng)性地理解索引適用場景和失效原理,可以顯著提升數(shù)據(jù)庫查詢性能。實(shí)際應(yīng)用中應(yīng)當(dāng)結(jié)合業(yè)務(wù)特點(diǎn)和數(shù)據(jù)分布,定期審查索引效果,避免過度索引和索引濫用。

以上就是MySQL索引選擇與失效場景全解析的詳細(xì)內(nèi)容,更多關(guān)于MySQL索引選擇與失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句)

    Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句)

    這篇文章主要介紹了Navicat Premium操作MySQL數(shù)據(jù)庫(執(zhí)行sql語句),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MySQL中獲取時(shí)間的所有方法小結(jié)

    MySQL中獲取時(shí)間的所有方法小結(jié)

    在MySQL數(shù)據(jù)庫開發(fā)中,獲取時(shí)間是一個(gè)常見的需求,MySQL提供了多種方法來獲取當(dāng)前日期、時(shí)間和時(shí)間戳,并且可以對時(shí)間進(jìn)行格式化、計(jì)算和轉(zhuǎn)換,本文介紹了一些常用的MySQL時(shí)間函數(shù)及其示例,需要的朋友可以參考下
    2024-07-07
  • MySQL Replace INTO的使用

    MySQL Replace INTO的使用

    今天DST里面有個(gè)插件作者問我關(guān)于Replace INTO和INSERT INTO的區(qū)別,我和他說晚上上我的blog看吧,那時(shí)候還在忙,現(xiàn)在從MYSQL手冊里找了點(diǎn)東西,MYSQL手冊里說REPLACE INTO說的還是比較詳細(xì)的.
    2008-04-04
  • MySQL數(shù)據(jù)庫服務(wù)器端核心參數(shù)詳解和推薦配置

    MySQL數(shù)據(jù)庫服務(wù)器端核心參數(shù)詳解和推薦配置

    MySQL手冊上也有服務(wù)器端參數(shù)的解釋,以及參數(shù)值的相關(guān)說明信息,現(xiàn)針對我們大家重點(diǎn)需要注意、需要修改或影響性能 的服務(wù)器端參數(shù),作其用處的解釋和如何配置參數(shù)值的推薦,此事情拖了不少時(shí)間,為方便大家?guī)兔m錯(cuò)
    2011-12-12
  • 服務(wù)從mysql遷移達(dá)夢數(shù)據(jù)庫的實(shí)現(xiàn)方案

    服務(wù)從mysql遷移達(dá)夢數(shù)據(jù)庫的實(shí)現(xiàn)方案

    達(dá)夢數(shù)據(jù)庫(DM8)作為主流國產(chǎn)關(guān)系型數(shù)據(jù)庫,兼容MySQL協(xié)議和大部分語法,這篇文章主要介紹了服務(wù)從mysql遷移達(dá)夢數(shù)據(jù)庫的實(shí)現(xiàn)方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • Mysql添加、刪除、主鍵(外鍵)方法詳細(xì)講解

    Mysql添加、刪除、主鍵(外鍵)方法詳細(xì)講解

    MySQL是一種廣泛使用的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在數(shù)據(jù)庫設(shè)計(jì)中主鍵和外鍵是兩個(gè)重要的概念,下面這篇文章主要給大家介紹了關(guān)于Mysql添加、刪除、主鍵(外鍵)方法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • MySQL DNS的使用過程詳細(xì)分析

    MySQL DNS的使用過程詳細(xì)分析

    當(dāng) mysql 客戶端連接 mysql 服務(wù)器 (進(jìn)程為:mysqld),mysqld 會(huì)創(chuàng)建一個(gè)新的線程來處理該請求。該線程先檢查是否主機(jī)名在主機(jī)名緩存中
    2012-11-11
  • mysql巡檢腳本(必看篇)

    mysql巡檢腳本(必看篇)

    下面小編就為大家?guī)硪黄猰ysql巡檢腳本(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 解決Navicat遠(yuǎn)程連接MySQL出現(xiàn) 10060 unknow error的方法

    解決Navicat遠(yuǎn)程連接MySQL出現(xiàn) 10060 unknow error的方法

    這篇文章主要介紹了解決Navicat遠(yuǎn)程連接MySQL出現(xiàn) 10060 unknow error的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • MySQL 安裝配置超完整教程

    MySQL 安裝配置超完整教程

    MySQL 是一款廣泛使用的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),由瑞典 MySQL AB公司開發(fā),目前屬于Oracle公司旗下產(chǎn)品,這篇文章主要介紹了MySQL安裝配置超完整教程,需要的朋友可以參考下
    2025-05-05

最新評論

揭阳市| 犍为县| 永福县| 毕节市| 宜兴市| 桃江县| 大渡口区| 高青县| 浦北县| 唐河县| 惠东县| 垣曲县| 碌曲县| 壤塘县| 贵阳市| 夏津县| 罗田县| 确山县| 额尔古纳市| 安国市| 大冶市| 乌拉特前旗| 陆丰市| 邯郸市| 罗江县| 安仁县| 涞源县| 衡阳县| 巴彦淖尔市| 富宁县| 许昌市| 门源| 河源市| 个旧市| 宜良县| 盱眙县| 广州市| 宁强县| 鲁山县| 河西区| 望城县|