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和emailCREATE 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'; -- 索引效果差-- 正确写法:使用INSELECT * FROM users WHERE status IN ('active', 'inactive');
4. 优化分页查询 - 大偏移量的解决方案
分页查询在后面的页数时会很慢:
-- 慢的写法:大偏移量SELECT * FROM users ORDER BY id LIMIT 100000, 10; -- 很慢-- 快的写法:使用上一页的最后一个IDSELECT * 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));-- 测试前缀长度是否合适SELECTCOUNT(DISTINCT email) as total_unique,COUNT(DISTINCT LEFT(email, 10)) as prefix_uniqueFROM users;-- 如果两个数字接近,说明前缀长度合适
好处: 节省空间,查询依然很快
6. 实用的索引检查技巧
定期检查索引使用情况:
-- 查看哪些索引没被使用过SELECTtable_name,index_nameFROM information_schema.statisticsWHERE table_schema = 'your_database'AND index_name NOT IN (SELECT index_nameFROM performance_schema.table_io_waits_summary_by_index_usageWHERE object_schema = 'your_database');-- 手动更新索引统计信息(数据变化很大时)ANALYZE TABLE users;-- 查看查询是否使用了索引EXPLAIN SELECT * FROM users WHERE status = 'active';-- 看key列是否有索引名称

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