Mysql索引体验

在实际开发中使用数据库时,难免会遇到一些大的表格数据。查询这些数据的时候,有时候SQL会特别慢。这时候有经验的高手会告诉你哪些领域搜索的比较多,加个索引就行了。

那么,如何合理构建指数呢?在此,我想分享一下我的一些经历。如有不妥之处,请批评指正。

1,不要盲目建指数,先分析再创建。

虽然索引可以大大提高我们的查询性能,但是我们也要知道,当你添加、删除、修改的时候,索引树也是要维护的。所以索引越多越好,但是按需。最好在开发完成后对整个模块进行分析,并为大部分查询建立联合索引。

2.使用联邦索引来覆盖尽可能多的条件。

这意味着,如果一个慢速sql中有五个where和一个order by,我们的联合索引将尽可能覆盖这五个查询条件,如果有必要,order by也将覆盖它们。

3.小基数字段不需要索引。

这意味着如果一个表中的一个字段只有几个值,那么你为这个字段设置的索引实际上是没有意义的。比如你设置了一个指数,那么排序就没有意义了(也就是指数里男女分开)。

因此,索引的建立应尽可能选择基数大的数据,这样可以最大限度地利用索引。

4.长字符串可以使用前缀索引。

我们尽量为索引选择较小类型的字段,比如varchar(20)和varchar(256),建立在20以上的索引和建立在256上的索引有明显的差距(字符串太长,不好排序,唉)。

当然,如果一定要对varchar(256)进行索引,可以选择其中的前20个字符放入索引树中(这里20不是绝对的,要选择能尽可能区分数据的最小字符字段设计)。像这样,键索引(姓名(20)、年龄、职务)只会搜索姓名的前20个字符,但前缀索引不能应用于order by和group by。

5.为排序字段设计索引的优先级较低。

如果我们在SQL中有一个范围搜索,后跟一个排序字段,那么我们优先索引范围搜索字段,而不是首先排序它们。

6.如果出现慢速SQL,可以只为此SQL设计一个联合索引。

但是慢SQL的优化需要一步一步来分析。可以先用explain检查SQL语句的分析结果,然后根据结果进行相应的改进。我们下次会谈到解释。

PS:在select语句前添加explain关键字,MySQL会在查询上设置一个标志,执行查询会返回执行计划的信息,而不是执行这条SQL。