1. 多字段索引的正确顺序 - 这个顺序很重要
大多数人建多字段索引时随便排序,其实顺序决定效果:
-- 假设经常这样查询用户
SELECT * FROM users WHERE status = 'active' AND age = 25 AND city = 'Beijing';
-- 错误的做法:随意排序
CREATE INDEX idx_user ON users(age, city, status);
-- 正确的做法:常用条件放前面
CREATE INDEX idx_user ON users(status, age, city);
为什么这样排序?
status
字段查询最频繁,放第一位age
其次,放第二位city
查询较少,放最后
记住: 最常用的查询条件放前面,这样索引效果最好
2. 包含所有查询字段的索引 - 避免额外查找
如果查询只需要几个字段,把这些字段都加到索引里:
-- 经常这样查询
SELECT id, name, email FROM users WHERE status = 'active';
-- 普通索引:还需要回到表里找name和email
CREATE INDEX idx_status ON users(status);
-- 优化后的索引:所有需要的字段都在索引里
CREATE INDEX idx_status_info ON users(status, id, name, email);
好处: 查询更快,因为不需要额外去表里找数据
3. 避免索引失效的常见错误
这些写法会让索引失效,查询变慢:
-- 错误写法1:在索引字段上使用函数
SELECT * FROM users WHERE YEAR(created_at) = 2024; -- 索引失效
-- 正确写法:使用范围查询
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';
-- 错误写法2:模糊查询用前缀%
SELECT * FROM users WHERE name LIKE '%john%'; -- 索引失效
-- 正确写法:后缀通配符
SELECT * FROM users WHERE name LIKE 'john%'; -- 可以用索引
-- 错误写法3:不等于查询
SELECT * FROM users WHERE status != 'deleted'; -- 索引效果差
-- 正确写法:使用IN
SELECT * FROM users WHERE status IN ('active', 'inactive');
4. 优化分页查询 - 大偏移量的解决方案
分页查询在后面的页数时会很慢:
-- 慢的写法:大偏移量
SELECT * FROM users ORDER BY id LIMIT 100000, 10; -- 很慢
-- 快的写法:使用上一页的最后一个ID
SELECT * FROM users WHERE id > 100000 ORDER BY id LIMIT 10; -- 很快
-- 或者记录上次查询的位置
SELECT * FROM users WHERE id > :last_id ORDER BY id LIMIT 10;
原理: 避免MySQL扫描前面10万条记录
5. 长字符串字段的索引优化
邮箱、URL等长字符串建索引很占空间:
-- 普通索引:占用空间大
CREATE INDEX idx_email ON users(email);
-- 前缀索引:只用邮箱前10个字符建索引
CREATE INDEX idx_email_prefix ON users(email(10));
-- 测试前缀长度是否合适
SELECT
COUNT(DISTINCT email) as total_unique,
COUNT(DISTINCT LEFT(email, 10)) as prefix_unique
FROM users;
-- 如果两个数字接近,说明前缀长度合适
好处: 节省空间,查询依然很快
6. 实用的索引检查技巧
定期检查索引使用情况:
-- 查看哪些索引没被使用过
SELECT
table_name,
index_name
FROM information_schema.statistics
WHERE table_schema = 'your_database'
AND index_name NOT IN (
SELECT index_name
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE object_schema = 'your_database'
);
-- 手动更新索引统计信息(数据变化很大时)
ANALYZE TABLE users;
-- 查看查询是否使用了索引
EXPLAIN SELECT * FROM users WHERE status = 'active';
-- 看key列是否有索引名称

優(yōu)網(wǎng)科技秉承"專業(yè)團(tuán)隊(duì)、品質(zhì)服務(wù)" 的經(jīng)營理念,誠信務(wù)實(shí)的服務(wù)了近萬家客戶,成為眾多世界500強(qiáng)、集團(tuán)和上市公司的長期合作伙伴!
優(yōu)網(wǎng)科技成立于2001年,擅長網(wǎng)站建設(shè)、網(wǎng)站與各類業(yè)務(wù)系統(tǒng)深度整合,致力于提供完善的企業(yè)互聯(lián)網(wǎng)解決方案。優(yōu)網(wǎng)科技提供PC端網(wǎng)站建設(shè)(品牌展示型、官方門戶型、營銷商務(wù)型、電子商務(wù)型、信息門戶型、微信小程序定制開發(fā)、移動(dòng)端應(yīng)用(手機(jī)站、APP開發(fā))、微信定制開發(fā)(微信官網(wǎng)、微信商城、企業(yè)微信)等一系列互聯(lián)網(wǎng)應(yīng)用服務(wù)。