索引的概念:索引就好比一本书的目录,它能帮助 MySQL 快速定位到表中的数据行,而不用全表扫描。通过创建合适的索引,可以大大提高查询的效率。例如,在一个存储了大量员工信息的表中,如果经常要根据员工的工号来查询员工记录,为工号字段创建索引后,数据库就能快速找到对应记录,而不是逐行去检查表中的每一条数据。
索引的类型:
B-Tree 索引(默认常用的索引类型):它以 B 树数据结构来存储索引数据,适用于全键值、键值范围和键前缀查找等情况。像常见的INT、VARCHAR等类型的字段创建索引时,一般就是 B-Tree 索引,比如在一个电商商品表中,对商品编号、商品名称等字段创建的索引往往就是 B-Tree 索引。
哈希索引:基于哈希表实现,只支持等值查询(也就是=、<=>操作符),对于范围查询等就不太适用了。例如在一些缓存系统中,如果只是简单地根据某个唯一标识快速查找对应缓存值,哈希索引可能比较合适。不过在 MySQL 中,哈希索引主要是在内存存储引擎(如 Memory 引擎)中使用,InnoDB 和 MyISAM 等常用存储引擎默认的索引不是哈希索引。
遵循最左前缀原则:如果创建了一个包含多个字段的复合索引(比如在员工表中创建了(name, age, department)这样的复合索引),在查询时,只有按照索引中字段的顺序从左到右使用字段进行条件查询时,索引才会被有效利用。例如WHERE name = '张三' AND age = 30这样的查询能用到复合索引,而WHERE age = 30 AND department = '研发部'就不能完全利用这个复合索引,因为跳过了最左边的name字段。
避免使用OR连接条件(除非每个OR分支都能利用索引):比如WHERE status = 1 OR name = '李四'这样的查询,如果status字段和name字段分别有索引,但是数据库在处理OR连接时往往很难同时有效利用这两个索引,可能会导致全表扫描。可以考虑改写查询逻辑,比如通过UNION操作等方式来分别查询满足不同条件的记录后再合并结果,提高查询效率。
根据数据量和业务场景选择合适的存储引擎及索引策略:
InnoDB 存储引擎:支持事务、行级锁等特性,适合对数据一致性、并发控制要求高的业务场景。它的索引结构(默认 B-Tree 索引)配合其聚簇索引(主键索引的数据行和索引数据存储在一起)的特点,在很多情况下能高效地支持查询、插入等操作。例如在一个电商系统中,商品表、订单表等核心数据表使用 InnoDB 存储引擎,通过合理创建索引(如对商品的分类字段、订单的用户 ID 字段等创建索引)可以很好地满足业务的查询和更新需求。