对于那些具有高选择性(列中不同值的数量与行数的比值较高)的列,索引效果会更好。比如用户表中的email字段,由于每个用户的邮箱通常是唯一的,选择性很高,所以在该列上创建索引能有效加速查询,如通过邮箱查找用户信息(SELECT * FROM users WHERE email = 'user@example.com')。
B - Tree 索引适用于大多数情况,特别是对于范围查询(如WHERE column BETWEEN value1 AND value2)、等值查询(如WHERE column = value)和ORDER BY操作。例如,在一个存储产品价格的表中,使用 B - Tree 索引可以高效地查询某个价格区间内的产品(SELECT * FROM products WHERE price BETWEEN 10 AND 20)。
哈希索引
哈希索引在等值查询(如WHERE column = value)上速度非常快,但是不支持范围查询。例如在一个缓存用户登录信息的表中,通过用户 ID 快速查找用户登录状态(SELECT logged_in FROM user_cache WHERE user_id = 123),哈希索引可以提供快速的查找。不过要注意,在 MySQL 中,只有 Memory 存储引擎支持显式的哈希索引,InnoDB 存储引擎会在内部对某些索引使用自适应哈希索引(由数据库自动管理)。
当创建复合索引(包含多个列的索引)时,应将最常用的列放在最左边。例如,在一个员工表中有department(部门)和salary(工资)两个列,经常会按照部门查询员工工资范围(SELECT * FROM employees WHERE department = 'IT' AND salary BETWEEN 5000 AND 10000),那么创建复合索引时应该是(department, salary)这样的顺序。因为在查询时,MySQL 会首先使用索引中的第一个列进行过滤,然后再考虑后面的列。
索引覆盖
尽量利用索引覆盖来减少回表查询。如果一个查询的所有列都包含在索引中,那么数据库可以直接从索引中获取数据,而不需要再去查找数据表中的行。例如,在一个包含id、name和age的用户表上,有一个索引(id, name),当执行查询SELECT id, name FROM users WHERE id BETWEEN 1 AND 10时,就可以直接从索引中获取数据,提高查询效率。
可以使用 MySQL 的性能监控工具(如EXPLAIN命令)来查看查询是否使用了索引以及如何使用索引。EXPLAIN会显示查询的执行计划,包括是否使用索引、使用了哪些索引以及索引的使用方式等信息。例如,EXPLAIN SELECT * FROM products WHERE price > 100可以帮助了解在这个价格查询中索引是否被有效利用。如果发现索引没有被正确使用,就需要检查查询语句和索引定义是否合理。