1. 字段的数值有唯一性的限制
索引本身可以起到约束的作用,比如唯一索引、主键索引都是可以起到唯一性约束的,因此在我们的数据表中,如果某个字段是唯一性的,就可以直接创建唯一性索引,或者主键索引。这样可以更快速地通过该索引来确定某条记录。
例如,学生表中学号是具有唯一性的字段,为该字段建立唯一性索引可以很快确定某个学生的信息,如果使用姓名的话,可能存在同名现象,从而降低查询速度。
2. 频繁作为 WHERE 查询条件的字段
3. 经常 GROUP BY 和 ORDER BY 的列
索引就是让数据按照某种顺序进行存储或检索,因此当我们使用 GROUP BY 对数据进行分组查询,或者使用 ORDER BY 对数据进行排序的时候,就需要 对分组或者排序的字段进行索引 。如果待排序的列有多个,那么可以在这些列上建立 组合索引 。
4. UPDATE、DELETE 的 WHERE 条件列
5. DISTINCT 字段需要创建索引
6. 多表 JOIN 连接操作时,创建索引注意事项
SELECT
c.course_id,
`name`,
s.student_id,
course_name
FROM
student_info s
JOIN course c
ON s.course_id = c.course_id
WHERE `name` = 'TNlNkJ' ;#(0.027sec)
(student_info 表中有 100万 条数据,course 表中有 100 条记录)当我们不对 name 字段添加索引时,运行时间为 0.027sec;
为 name 字段添加索引(再执行上述查询时,运行时间为 0.002sec):
ALTER TABLE student_info ADD INDEX s_name (`name`);
7. 使用列的类型小的创建索引
我们这里所说的 类型大小 指的就是该类型表示的数据范围的大小。
比如我们能使用INT就不要使用BIGINT,能使用MEDIUMINT就不要使用INT。这是因为:
- 数据类型越小,在查询时进行的比较操作越快
- 数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘 I/O 带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。
这个建议对于 表的主键来说更加适用,因为不仅是聚簇索引中会存储主键值,其他所有的二级索引的节点处都会存储一份记录的主键值,如果主键使用更小的数据类型,也就意味着节省更多的存储空间和更高效的 I/O。
8. 使用字符串前缀创建索引
可以通过截取字段的前面一部分内容建立索引,这个就叫 前缀索引。这样在查找记录时虽然不能精确的定位到记录的位置,但是能定位到相应前缀所在的位置,然后根据前缀相同的记录的主键值回表查询完整的字符串值。
9. 区分度高(散列性高)的列适合作为索引
10. 使用最频繁的列放到联合索引的左侧
这样可以较少的建立一些索引。同时,由于“最左前缀原则”,可以增加联合索引的使用率。