Debian MySQL索引使用技巧
根据查询需求选择匹配的索引类型,能有效提升查询效率:
WHERE email = 'xxx'),是最基础的索引类型;WHERE age = 25 AND city = 'Beijing'),需遵循最左前缀原则(查询条件需包含索引最左列,如age);username),同时加速唯一性查询;WHERE product_name LIKE '%phone%'),支持自然语言搜索;WHERE、JOIN、ORDER BY子句中频繁使用的列创建索引(如订单表的order_date、用户表的email);user_id的唯一性远高于gender),区分度高则索引过滤效果好;status(只有0/1两种值),索引效果有限,反而增加维护成本。INDEX (age, city)比INDEX (city, age)更适合WHERE age = 25 AND city = 'Beijing'的查询);(age, city),无需再建age的单列索引)。WHERE YEAR(create_time) = 2023)会导致索引失效,应改用范围查询(WHERE create_time >= '2023-01-01' AND create_time < '2024-01-01');LIKE '%keyword'会导致索引失效,若需模糊匹配结尾,可使用LIKE 'keyword%';OR连接时,若其中一列无索引,可能导致整个查询无法使用索引(如WHERE age = 25 OR name = 'John',若name无索引,则age的索引可能失效)。覆盖索引是指查询所需的列均包含在索引中,无需回表查询(如INDEX (column1, column2),查询SELECT column1, column2 FROM table WHERE column1 = 'value'时,可直接从索引获取数据,减少磁盘I/O)。设计时尽量让索引覆盖常用查询列。
ANALYZE TABLE table_name更新表的统计信息,帮助优化器选择更优的执行计划;OPTIMIZE TABLE table_name整理索引碎片(尤其频繁增删改的表),提高索引访问速度;EXPLAIN SELECT ...查看执行计划,重点关注type(访问类型,如ref、range优于ALL)、key(使用的索引)、rows(扫描行数)等字段,判断索引是否有效;slow_query_log = ON),分析执行慢的SQL,针对性优化索引。SELECT id, name FROM users),减少数据传输量和回表次数;LIMIT 10),避免全表扫描;SELECT a.* FROM table1 a JOIN table2 b ON a.id = b.a_id比子查询更高效,且能更好利用索引。