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列是否有索引名称

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!
优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站、APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。