Mysql索引相关知识点总结

1. 创建索引的语法

单列索引语法

多列索引语法

2. 索引的基数

当查询使用不止一个索引的时候,mysql会找到一个最高效的索引。
举例说明:

在上面的例子中,mysql必须在possible_keys中,做出选择,可以看到,相比type,founded是更高效的索引。我们可以使用索引基数来确定最佳索引。

从上面的信息中,可以看到founded有更高的索引基数,Cardinality值最大。索引基数可以通过公式:
(索引的唯一性数量/索引的总行数) 来计算。理想情况下,值为1,比如主键索引。
尽管索引基数是唯一性的一个重要指标,但Mysql也会参考有关唯一值的范围和容量等统计信息。有时需要select count(*) 来确定最佳索引。

3. 如果查找的词是以通配符开头,则mysql不会使用索引。

举例说明:

如果你需要经常查询一个以通配符开头的查询,常用的方法是在数据库中保存需要查询的值的反序值。例如,假设你查找所有.com结尾的电子邮箱地址,当搜索email like ‘%.com’ 是不会用到索引的。但是,而搜索reverse_email like REVERSE(‘%.com’) 就可以使用定在在reverse_email上面的索引。

4. mysql不支持基于索引的函数。

举例说明:

因为使用了name列的UPPER函数,索引不会应该name索引。

5. 删除重复索引

任何包含在其他索引的最左边的索引都是重复索引。例如:

从上面看出,country_id就是重复索引,因为已经存在m2索引。我们再来看以下的语句。

可以看到使用索引country_id和m2效果是一样的,影响的行数都是11。use index是索引提示的语法,还可以用到的关键字是ignore和force。具体的语法如下:

6. 在InnoDB中,主码的值会附加在非主码索引的每个对应的记录的后面,因此没有必要在在非主码索引中指定主码。这一重要特性意味着InnoDB中的所有非主码索引都隐含有主码列了。

7. 覆盖索引

在Extra中显示Using index时,这并不意味着在访问底层表数据时使用到了索引,这表示只有这个索引才是满足查询所要求的。这种索引称为覆盖索引,比如上面的founded_name。

覆盖索引得名于它满足了查询中给定表用到的所有的列。想要创建一个覆盖索引,这个索引必须包含指定表上包括WHERE语句,ORDER BY语句,GROUP BY语句以及SELECT语句中的所有列。

不要在sql查询中使用select * 。如果在select指定真正用到的列,那么就可以创建合适的索引提高性能。

8.局部索引

如果MySQL需要获取大量行中的更多列的数据,那么创建具有更小行宽度的小型索引会更加有效。

此条目发表在MYSQL分类目录。将固定链接加入收藏夹。

Mysql索引相关知识点总结》有 1 条评论

发表评论

邮箱地址不会被公开。