MySQL中慢查詢(xún)分析與索引優(yōu)化實(shí)戰(zhàn)技巧
一、慢查詢(xún)定位:找到性能瓶頸
1.1 開(kāi)啟慢查詢(xún)?nèi)罩?/h3>
-- 查看當(dāng)前配置
SHOW VARIABLES LIKE '%slow_query%';
-- 動(dòng)態(tài)開(kāi)啟(重啟失效)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 閾值設(shè)為2秒
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
-- 永久生效(修改my.cnf)
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1 -- 記錄未走索引的查詢(xún)
-- 查看當(dāng)前配置 SHOW VARIABLES LIKE '%slow_query%'; -- 動(dòng)態(tài)開(kāi)啟(重啟失效) SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; -- 閾值設(shè)為2秒 SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log'; -- 永久生效(修改my.cnf) [mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 log_queries_not_using_indexes = 1 -- 記錄未走索引的查詢(xún)
1.2 分析工具推薦
| 工具 | 使用場(chǎng)景 | 命令示例 |
|---|---|---|
| mysqldumpslow | 官方自帶,基礎(chǔ)分析 | mysqldumpslow -s t /path/to/slow.log |
| pt-query-digest | 高級(jí)分析,生成詳細(xì)報(bào)告 | pt-query-digest slow.log > report.txt |
| Percona Toolkit | 專(zhuān)業(yè)級(jí)分析,支持多維度統(tǒng)計(jì) | pt-query-digest --filter '$event->{arg} =~ m/SELECT/i' slow.log |
二、核心優(yōu)化策略:從SQL到架構(gòu)
2.1 索引優(yōu)化(90%的性能問(wèn)題根源)
黃金法則:
- 最左前綴原則:聯(lián)合索引按字段順序匹配
- 覆蓋索引:SELECT字段全在索引中,避免回表
- 索引選擇性:區(qū)分度高的字段(如唯一ID)優(yōu)先建索引
示例優(yōu)化:
-- 優(yōu)化前(全表掃描) SELECT * FROM orders WHERE status = 'paid' AND create_time > '2023-01-01'; -- 添加聯(lián)合索引 ALTER TABLE orders ADD INDEX idx_status_time(status, create_time); -- 優(yōu)化后(索引范圍掃描) SELECT id, status, amount FROM orders WHERE status = 'paid' AND create_time > '2023-01-01';
2.2 SQL語(yǔ)句重構(gòu)
常見(jiàn)問(wèn)題與解決方案:
| 問(wèn)題類(lèi)型 | 優(yōu)化方案 | 示例 |
|---|---|---|
| 大分頁(yè)查詢(xún) | 使用WHERE替代LIMIT OFFSET | WHERE id > 1000 LIMIT 10 |
| 隱式類(lèi)型轉(zhuǎn)換 | 保持字段與參數(shù)類(lèi)型一致 | WHERE phone = '13800138000' |
| 不必要的排序 | 移除ORDER BY或添加索引 | 添加INDEX(create_time) |
| IN子查詢(xún) | 改用JOIN | JOIN (SELECT id FROM ...) tmp |
2.3 EXPLAIN執(zhí)行計(jì)劃解析
關(guān)鍵字段解讀:
EXPLAIN SELECT * FROM users WHERE age > 20;
| 字段 | 理想值 | 問(wèn)題信號(hào) |
|---|---|---|
| type | ref/range/index | ALL(全表掃描) |
| key | 使用索引名稱(chēng) | NULL(未用索引) |
| rows | 掃描行數(shù)少 | 數(shù)值過(guò)大(如>10000) |
| Extra | Using index | Using filesort/Using temporary |
三、高級(jí)調(diào)優(yōu):參數(shù)與架構(gòu)升級(jí)
3.1 參數(shù)優(yōu)化(my.cnf關(guān)鍵配置)
[mysqld] # 緩沖池大?。ㄍǔTO(shè)為物理內(nèi)存的70%-80%) innodb_buffer_pool_size = 8G # 日志寫(xiě)入策略 innodb_flush_log_at_trx_commit = 1 # 高安全要求 innodb_flush_log_at_trx_commit = 2 # 高性能場(chǎng)景 # 連接管理 max_connections = 500 thread_cache_size = 50
3.2 架構(gòu)升級(jí)方案
| 場(chǎng)景 | 解決方案 | 優(yōu)勢(shì) |
|---|---|---|
| 單表數(shù)據(jù)量過(guò)大(>5000萬(wàn)) | 分庫(kù)分表(Sharding) | 水平擴(kuò)展,降低單表壓力 |
| 高頻復(fù)雜查詢(xún) | 讀寫(xiě)分離(主從復(fù)制) | 分散讀壓力 |
| 實(shí)時(shí)分析需求 | 使用列式存儲(chǔ)(如ClickHouse) | 提升聚合查詢(xún)速度 |
四、預(yù)防與監(jiān)控:建立長(zhǎng)效機(jī)制
4.1 實(shí)時(shí)監(jiān)控工具
- Percona Monitoring and Management (PMM) :監(jiān)控慢查詢(xún)、鎖等待
- Prometheus + Grafana:自定義指標(biāo)可視化
- MySQL Enterprise Monitor:官方企業(yè)級(jí)方案
4.2 自動(dòng)化優(yōu)化建議
-- 使用內(nèi)置診斷工具 ANALYZE TABLE orders; -- 更新統(tǒng)計(jì)信息 OPTIMIZE TABLE logs; -- 重建表(針對(duì)碎片化嚴(yán)重場(chǎng)景) -- 查詢(xún)優(yōu)化建議器 SELECT * FROM sys.schema_index_statistics; SELECT * FROM sys.statements_with_full_table_scans;
五、實(shí)戰(zhàn)案例:電商訂單查詢(xún)優(yōu)化
5.1 原始慢查詢(xún)(執(zhí)行時(shí)間3.2秒)
SELECT * FROM orders
WHERE user_id = 1001
AND status IN ('paid', 'shipped')
ORDER BY create_time DESC
LIMIT 0, 10;
5.2 優(yōu)化步驟
執(zhí)行計(jì)劃分析:發(fā)現(xiàn)type=ALL,未使用索引
創(chuàng)建覆蓋索引:
ALTER TABLE orders ADD INDEX idx_user_status_time(user_id, status, create_time);
SQL改寫(xiě):
SELECT id, user_id, status, amount, create_time
FROM orders
WHERE user_id = 1001
AND status IN ('paid', 'shipped')
ORDER BY create_time DESC
LIMIT 10;
結(jié)果:執(zhí)行時(shí)間降至28ms,提升115倍!
總結(jié):MySQL慢查詢(xún)優(yōu)化需結(jié)合索引策略、SQL重構(gòu)、參數(shù)調(diào)優(yōu)三位一體。通過(guò)EXPLAIN分析執(zhí)行計(jì)劃,使用pt-query-digest定位問(wèn)題查詢(xún),建立監(jiān)控體系預(yù)防性能退化,方能實(shí)現(xiàn)數(shù)據(jù)庫(kù)高效穩(wěn)定運(yùn)行。
六、21個(gè)MySQL索引優(yōu)化實(shí)戰(zhàn)技巧
MySQL索引優(yōu)化是提升數(shù)據(jù)庫(kù)性能的關(guān)鍵手段,一個(gè)合理的索引設(shè)計(jì)和使用策略,往往能將查詢(xún)速度提升幾十倍甚至上百倍。然而,索引優(yōu)化并不簡(jiǎn)單,既需要扎實(shí)的理論基礎(chǔ),也需要豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)。
本文總結(jié)了21個(gè)MySQL索引優(yōu)化的實(shí)戰(zhàn)技巧,從索引選擇、設(shè)計(jì)到維護(hù)、監(jiān)控的全生命周期,幫助你解決日常開(kāi)發(fā)中的索引性能問(wèn)題。
6.1 基礎(chǔ)知識(shí)回顧
在具體介紹前,讓我們先簡(jiǎn)單回顧索引的基礎(chǔ)知識(shí):
MySQL常用的索引類(lèi)型包括:主鍵索引、唯一索引、普通索引、聯(lián)合索引、全文索引等。其中最常用的B+樹(shù)索引,具有以下特點(diǎn):
- 非葉子節(jié)點(diǎn)只存儲(chǔ)鍵值信息
- 所有葉子節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄
- 葉子節(jié)點(diǎn)通過(guò)指針連接,方便范圍查詢(xún)
- 所有節(jié)點(diǎn)按鍵值大小排序
理解這些基礎(chǔ)對(duì)于后續(xù)優(yōu)化至關(guān)重要。接下來(lái),讓我們進(jìn)入正題。
6.2 索引設(shè)計(jì)優(yōu)化
1. 遵循最左匹配原則,合理設(shè)計(jì)聯(lián)合索引順序
聯(lián)合索引的順序直接影響其使用效率。MySQL會(huì)從左到右依次使用索引列,如果中間某列沒(méi)有使用,則后面的列也無(wú)法使用索引。
錯(cuò)誤示例:
-- 創(chuàng)建索引(name, age, city) CREATE INDEX idx_user_name_age_city ON user(name, age, city); -- 以下查詢(xún)無(wú)法充分利用索引 SELECT * FROM user WHERE age = 25 AND city = 'Beijing'; -- name列缺失,只能全表掃描 SELECT * FROM user WHERE name = 'Tom' AND city = 'Beijing'; -- 中間age列缺失,city無(wú)法使用索引
優(yōu)化方法:
- 將選擇性高的列放在前面(選擇性 = 不重復(fù)值 / 總記錄數(shù))
- 將常用于條件查詢(xún)的列放在前面
- 考慮范圍查詢(xún)的列放在最后
-- 假設(shè)選擇性:city < name < age CREATE INDEX idx_user_name_age_city ON user(name, age, city); -- 充分利用索引的查詢(xún) SELECT * FROM user WHERE name = 'Tom' AND age = 25; SELECT * FROM user WHERE name = 'Tom' AND age = 25 AND city = 'Beijing';
2. 利用覆蓋索引避免回表查詢(xún)
回表操作是指通過(guò)索引找到對(duì)應(yīng)的行記錄指針,再通過(guò)指針去查詢(xún)完整記錄的過(guò)程。如果查詢(xún)只需要返回索引包含的列,則可以避免回表,這稱(chēng)為覆蓋索引。
優(yōu)化前:
-- 創(chuàng)建普通索引 CREATE INDEX idx_user_name ON user(name); -- 需要回表查詢(xún) SELECT id, name, age, city FROM user WHERE name = 'Tom';
優(yōu)化后:
-- 創(chuàng)建包含所需字段的索引 CREATE INDEX idx_user_name_age_city ON user(name, age, city); -- 使用覆蓋索引,無(wú)需回表 SELECT name, age, city FROM user WHERE name = 'Tom';
3. 針對(duì)字符串列使用前綴索引
對(duì)于CHAR和VARCHAR類(lèi)型的列,如果整列長(zhǎng)度較大,可以只索引開(kāi)頭的部分字符,這樣可以大幅減少索引占用空間,提高索引效率。
優(yōu)化方法:
-- 假設(shè)product_desc是較長(zhǎng)的產(chǎn)品描述文本 CREATE INDEX idx_product_desc ON product(product_desc(50));
如何確定前綴長(zhǎng)度?可以通過(guò)計(jì)算選擇性來(lái)確定:
-- 計(jì)算不同前綴長(zhǎng)度的選擇性
SELECT
COUNT(DISTINCT LEFT(product_desc, 10)) / COUNT(*) AS sel_10,
COUNT(DISTINCT LEFT(product_desc, 20)) / COUNT(*) AS sel_20,
COUNT(DISTINCT LEFT(product_desc, 30)) / COUNT(*) AS sel_30,
COUNT(DISTINCT LEFT(product_desc, 40)) / COUNT(*) AS sel_40,
COUNT(DISTINCT LEFT(product_desc, 50)) / COUNT(*) AS sel_50,
COUNT(DISTINCT product_desc) / COUNT(*) AS sel_full
FROM product;
選擇一個(gè)接近完整列選擇性的前綴長(zhǎng)度即可。
注意事項(xiàng): 使用前綴索引后,無(wú)法使用該索引做ORDER BY或GROUP BY,也無(wú)法使用覆蓋索引。
4. 合理使用復(fù)合索引替代多個(gè)單列索引
多個(gè)單列索引在多條件查詢(xún)時(shí),MySQL只會(huì)選擇一個(gè)索引。而復(fù)合索引可以同時(shí)滿(mǎn)足多個(gè)條件的查詢(xún)需求。
優(yōu)化前:
-- 單獨(dú)創(chuàng)建兩個(gè)索引 CREATE INDEX idx_user_age ON user(age); CREATE INDEX idx_user_city ON user(city); -- MySQL通常只會(huì)選擇一個(gè)索引 SELECT * FROM user WHERE age = 25 AND city = 'Beijing';
優(yōu)化后:
-- 創(chuàng)建一個(gè)復(fù)合索引 CREATE INDEX idx_user_age_city ON user(age, city); -- 可以同時(shí)使用age和city條件 SELECT * FROM user WHERE age = 25 AND city = 'Beijing';
5. 使用前綴索引優(yōu)化模糊查詢(xún)的左匹配
LIKE語(yǔ)句使用通配符前綴(如'%abc')會(huì)導(dǎo)致索引失效。但對(duì)于右匹配模式(如'abc%'),索引仍然有效。
可以使用索引的查詢(xún):
-- 可以使用索引 SELECT * FROM products WHERE product_name LIKE 'iphone%';
無(wú)法使用索引的查詢(xún):
-- 無(wú)法使用索引 SELECT * FROM products WHERE product_name LIKE '%iphone%';
優(yōu)化方法:
對(duì)于需要搜索包含某個(gè)關(guān)鍵詞的記錄,可以考慮全文索引或搜索引擎。對(duì)于簡(jiǎn)單場(chǎng)景,也可以通過(guò)字段冗余解決:
-- 添加一個(gè)反轉(zhuǎn)字段
ALTER TABLE products ADD product_name_reversed VARCHAR(255);
-- 觸發(fā)器維護(hù)反轉(zhuǎn)值, 此處為了簡(jiǎn)單表示整體實(shí)現(xiàn)思路, 實(shí)際通常在代碼中進(jìn)行反轉(zhuǎn)值賦值
DELIMITER //
CREATE TRIGGER product_insert BEFORE INSERT ON products
FOR EACH ROW
BEGIN
SET NEW.product_name_reversed = REVERSE(NEW.product_name);
END; //
DELIMITER ;
-- 創(chuàng)建反轉(zhuǎn)字段的索引
CREATE INDEX idx_product_name_rev ON products(product_name_reversed);
-- 搜索以'phone'結(jié)尾的產(chǎn)品
SELECT * FROM products
WHERE product_name_reversed LIKE CONCAT(REVERSE('phone'), '%');
索引使用優(yōu)化
6. 避免在WHERE子句中對(duì)字段進(jìn)行函數(shù)運(yùn)算
在字段上使用函數(shù)會(huì)導(dǎo)致索引失效,應(yīng)該把運(yùn)算轉(zhuǎn)移到值上。
錯(cuò)誤用法:
-- 索引失效 SELECT * FROM orders WHERE YEAR(create_time) = 2023;
優(yōu)化方法:
-- 可以使用索引 SELECT * FROM orders WHERE create_time >= '2023-01-01' AND create_time < '2024-01-01';
7. 避免隱式類(lèi)型轉(zhuǎn)換導(dǎo)致索引失效
MySQL在進(jìn)行查詢(xún)時(shí),如果字段類(lèi)型與條件值類(lèi)型不匹配,會(huì)進(jìn)行隱式類(lèi)型轉(zhuǎn)換,可能導(dǎo)致索引失效。
錯(cuò)誤用法:
-- user_id是varchar類(lèi)型,但使用了整數(shù)條件 CREATE INDEX idx_user_id ON users(user_id); SELECT * FROM users WHERE user_id = 12345; -- 索引可能失效
優(yōu)化方法:
-- 確保條件值類(lèi)型與字段類(lèi)型一致 SELECT * FROM users WHERE user_id = '12345'; -- 使用字符串類(lèi)型
8. 小心使用NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等否定操作符
否定條件通常會(huì)導(dǎo)致索引失效,因?yàn)閿?shù)據(jù)庫(kù)需要檢查所有不滿(mǎn)足條件的記錄。
優(yōu)化方法:
盡量用肯定表達(dá)式替代否定表達(dá)式:
-- 優(yōu)化前:無(wú)法充分利用索引 SELECT * FROM products WHERE category_id != 5; -- 優(yōu)化后:可以使用索引 SELECT * FROM products WHERE category_id < 5 OR category_id > 5;
9. 合理使用LIMIT優(yōu)化分頁(yè)查詢(xún)
大偏移量的LIMIT分頁(yè)查詢(xún)效率較低,因?yàn)镸ySQL需要檢索前N條記錄然后丟棄。
優(yōu)化前:
-- 性能較差的分頁(yè)查詢(xún) SELECT * FROM products ORDER BY id LIMIT 100000, 10;
優(yōu)化方法1 - 使用索引覆蓋掃描:
-- 先獲取ID,再關(guān)聯(lián)查詢(xún)完整數(shù)據(jù)
SELECT p.* FROM products p
JOIN (
SELECT id FROM products ORDER BY id LIMIT 100000, 10
) tmp ON p.id = tmp.id;
優(yōu)化方法2 - 使用上次查詢(xún)的最大ID:
-- 假設(shè)已知上一頁(yè)的最大ID是100233 SELECT * FROM products WHERE id > 100233 ORDER BY id LIMIT 10;
10. 避免使用SELECT *,只查詢(xún)需要的列
使用SELECT *會(huì)返回所有列,可能破壞覆蓋索引的效果,并增加網(wǎng)絡(luò)和內(nèi)存開(kāi)銷(xiāo)。
優(yōu)化前:
-- 可能導(dǎo)致不必要的開(kāi)銷(xiāo) SELECT * FROM users WHERE name = 'Tom';
優(yōu)化后:
-- 只返回需要的列,可能利用覆蓋索引 SELECT id, name, email FROM users WHERE name = 'Tom';
11. 使用EXPLAIN分析查詢(xún)執(zhí)行計(jì)劃
在優(yōu)化前,先使用EXPLAIN分析SQL語(yǔ)句的執(zhí)行計(jì)劃,了解索引使用情況。
EXPLAIN SELECT * FROM users WHERE name = 'Tom' AND age > 20;
重點(diǎn)關(guān)注以下字段:
type: 從好到差依次是:system > const > eq_ref > ref > range > index > ALLkey: 實(shí)際使用的索引rows: 預(yù)計(jì)需要掃描的行數(shù)Extra: 額外信息,如"Using index"表示使用了覆蓋索引
6.3 特殊場(chǎng)景索引優(yōu)化
12. 使用索引排序優(yōu)化ORDER BY操作
如果ORDER BY的列與WHERE使用的列不一致,排序無(wú)法使用索引,會(huì)導(dǎo)致文件排序。
優(yōu)化前:
-- WHERE和ORDER BY使用不同的列,可能導(dǎo)致文件排序 CREATE INDEX idx_user_name ON users(name); SELECT * FROM users WHERE name = 'Tom' ORDER BY age;
優(yōu)化后:
-- 創(chuàng)建聯(lián)合索引同時(shí)包含WHERE和ORDER BY的列 CREATE INDEX idx_user_name_age ON users(name, age); SELECT * FROM users WHERE name = 'Tom' ORDER BY age;
注意事項(xiàng): ORDER BY的多個(gè)字段需要與索引順序一致,且排序方向需一致(全ASC或全DESC)。
13. 在大表上創(chuàng)建索引的最佳實(shí)踐
在大表上直接創(chuàng)建索引可能會(huì)導(dǎo)致長(zhǎng)時(shí)間鎖表。可以使用以下方法優(yōu)化:
方法1 - 使用低峰期操作:
-- 在低峰期執(zhí)行索引創(chuàng)建 CREATE INDEX idx_order_status ON orders(status);
方法2 - 使用在線(xiàn)DDL(MySQL 8.0+):
-- 使用ALGORITHM和LOCK選項(xiàng) CREATE INDEX idx_order_status ON orders(status) ALGORITHM=INPLACE, LOCK=NONE;
方法3 - 使用pt-online-schema-change工具:
pt-online-schema-change --alter "ADD INDEX idx_order_status (status)" \ --host=localhost --user=root --ask-pass --database=mydb --table=orders \ --execute
14. 使用虛擬列為計(jì)算結(jié)果創(chuàng)建索引
對(duì)于經(jīng)常需要計(jì)算后過(guò)濾的場(chǎng)景,可以使用虛擬列并在其上創(chuàng)建索引。
-- 添加虛擬列存儲(chǔ)計(jì)算結(jié)果 ALTER TABLE products ADD total_value DECIMAL(10,2) AS (price * quantity) VIRTUAL; -- 在虛擬列上創(chuàng)建索引 CREATE INDEX idx_total_value ON products(total_value); -- 使用計(jì)算列進(jìn)行查詢(xún) SELECT * FROM products WHERE total_value > 10000;
15. 使用哈希索引優(yōu)化等值查詢(xún)
InnoDB不支持顯式的哈希索引,但我們可以自己實(shí)現(xiàn):
-- 添加哈希列
ALTER TABLE users ADD name_hash INT UNSIGNED
GENERATED ALWAYS AS (crc32(name)) STORED;
-- 在哈希列上創(chuàng)建索引
CREATE INDEX idx_name_hash ON users(name_hash);
-- 使用哈希索引查詢(xún)
SELECT * FROM users
WHERE name_hash = crc32('Tom') AND name = 'Tom';
注意最后還需要驗(yàn)證原始值,因?yàn)楣?赡軟_突。
6.4 索引維護(hù)優(yōu)化
16. 定期優(yōu)化和重建索引
隨著數(shù)據(jù)變化,索引可能變得碎片化,影響性能。定期優(yōu)化表和重建索引可以改善性能。
-- 分析表 ANALYZE TABLE orders; -- 優(yōu)化表 OPTIMIZE TABLE orders; -- 或者重建索引 ALTER TABLE orders DROP INDEX idx_status, ADD INDEX idx_status(status);
建議: 設(shè)置一個(gè)低峰期的定時(shí)任務(wù),對(duì)重要表執(zhí)行優(yōu)化操作。
17. 控制單表上的索引數(shù)量
索引數(shù)量過(guò)多會(huì)影響寫(xiě)性能,建議每個(gè)表的索引數(shù)量控制在5個(gè)以?xún)?nèi)。
優(yōu)化方法:
- 刪除重復(fù)和未使用的索引
- 合并功能類(lèi)似的索引
-- 查找未使用的索引 SELECT * FROM schema_unused_indexes; -- Performance Schema -- 查找重復(fù)的索引 SELECT * FROM sys.schema_redundant_indexes; -- Sys Schema
18. 使用降序索引優(yōu)化排序
MySQL 8.0+支持降序索引,可以?xún)?yōu)化混合排序方向的查詢(xún)。
-- 創(chuàng)建混合排序方向的索引(MySQL 8.0+) CREATE INDEX idx_user_age_score ON users(age ASC, score DESC); -- 可以高效執(zhí)行的查詢(xún) SELECT * FROM users ORDER BY age ASC, score DESC;
19. 使用部分索引優(yōu)化高選擇性數(shù)據(jù)
MySQL 8.0+支持在WHERE條件滿(mǎn)足時(shí)才為行創(chuàng)建索引記錄,減少索引大小。
-- 只為活躍用戶(hù)創(chuàng)建索引(MySQL 8.0+) CREATE INDEX idx_active_users ON users(name, email) WHERE status = 'active';
6.5索引監(jiān)控與進(jìn)階技巧
20. 利用索引統(tǒng)計(jì)信息進(jìn)行調(diào)優(yōu)
MySQL維護(hù)了索引統(tǒng)計(jì)信息,可以幫助優(yōu)化器選擇合適的索引。有時(shí)統(tǒng)計(jì)信息不準(zhǔn)確會(huì)導(dǎo)致次優(yōu)的執(zhí)行計(jì)劃。
-- 查看表的統(tǒng)計(jì)信息 SHOW TABLE STATUS LIKE 'users'; -- 查看索引的基數(shù) SHOW INDEX FROM users; -- 刷新統(tǒng)計(jì)信息 ANALYZE TABLE users;
21. 使用索引提示(Index Hints)解決優(yōu)化器選擇問(wèn)題
有時(shí)MySQL優(yōu)化器的選擇不是最優(yōu)的,可以使用索引提示強(qiáng)制使用特定索引。
-- 強(qiáng)制使用特定索引 SELECT * FROM users FORCE INDEX(idx_name_age) WHERE name = 'Tom' AND age > 20; -- 忽略特定索引 SELECT * FROM users IGNORE INDEX(idx_status) WHERE status = 'active' AND age > 20;
建議: 索引提示應(yīng)該是最后的手段,通常先嘗試優(yōu)化表結(jié)構(gòu)和索引設(shè)計(jì)。
七、總結(jié)
索引優(yōu)化是一個(gè)持續(xù)的過(guò)程,需要結(jié)合業(yè)務(wù)特點(diǎn)、數(shù)據(jù)分布和查詢(xún)模式來(lái)綜合考慮。
優(yōu)秀的索引設(shè)計(jì)需要理論知識(shí)和實(shí)踐經(jīng)驗(yàn)的結(jié)合。
以上就是MySQL中慢查詢(xún)分析與索引優(yōu)化實(shí)戰(zhàn)技巧的詳細(xì)內(nèi)容,更多關(guān)于MySQL慢查詢(xún)與索引的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL中Navicat自動(dòng)備份的實(shí)現(xiàn)
本文主要介紹了MySQL中Navicat自動(dòng)備份的實(shí)現(xiàn),包括手動(dòng)備份和自動(dòng)定時(shí)備份,文中通過(guò)圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
windows無(wú)法啟動(dòng)MySQL服務(wù)報(bào)錯(cuò)1067的解決方法
這篇文章主要為大家詳細(xì)介紹了windows無(wú)法啟動(dòng)MySQL服務(wù)報(bào)錯(cuò)1067的3種解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
數(shù)據(jù)庫(kù)管理中19個(gè)MySQL優(yōu)化方法
小編給大家總結(jié)了19條非常實(shí)用的MySQL數(shù)據(jù)庫(kù)優(yōu)化方法,這是每個(gè)服務(wù)器管理人員都必須知道的,一起學(xué)習(xí)下。2017-11-11
Mysql刪除重復(fù)的數(shù)據(jù) Mysql數(shù)據(jù)去重復(fù)
這篇文章主要介紹了Mysql刪除重復(fù)的數(shù)據(jù) Mysql數(shù)據(jù)去重復(fù),需要的朋友可以參考下2016-08-08
mysql installer web community 5.7.21.0.msi安裝圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql installer web community 5.7.21.0.msi,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
VS2019連接MySQL數(shù)據(jù)庫(kù)的過(guò)程及常見(jiàn)問(wèn)題總結(jié)
今天想使用VS2019可以配合MySQL一起使用,在配置過(guò)程中出現(xiàn)一些錯(cuò)誤,下面通過(guò)本文給大家分享VS2019連接MySQL數(shù)據(jù)庫(kù)的過(guò)程及常見(jiàn)問(wèn)題總結(jié),感興趣的朋友跟隨小編一起看看吧2021-11-11

