设计Mysql索引的原则

        1. 搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出如今WHERE 子句中的列,或连接子句中指定的列,而不是出如今SELECT keyword后的选择列表中的列。

        2. 使用惟一索引。考虑某列中值的分布。对于惟一值的列,索引的效果最好,而具有多个反复值的列,其索引效果最差。比如,存放年龄的列具有不同值,非常easy区分各行。而用来记录性别的列,仅仅含有“ M”和“F”,则对此列进行索引没有多大用处(无论搜索哪个值,都会得出大约一半的行)

        3. 使用短索引。假设对串列进行索引,应该指定一个前缀长度,仅仅要有可能就应该这样做。比如,假设有一个CHAR(200) 列,假设在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。对前10 个或20 个字符进行索引可以节省大量索引空间,也可能会使查询更快。较小的索引涉及的磁盘I/O 较少,较短的值比較起来更快。更为重要的是,对于较短的键值,索引快速缓存中的块能容纳很多其它的键值,因此,MySQL也可以在内存中容纳很多其它的值。这添加了找到行而不用读取索引中较多块的可能性。(当然,应该利用一些常识。如仅用列值的第一个字符进行索引是不可能有多大优点的,由于这个索引中不会有很多不同的值。)

        4. 利用最左前缀。在创建一个n 列的索引时,实际是创建了MySQL 可利用的n 个索引。多列索引可起几个索引的作用,由于可利用索引中最左边的列集来匹配行。这种列集称为最左前缀。(这与索引一个列的前缀不同,索引一个列的前缀是利用该的前n 个字符作为索引值。)

        5. 不要过度索引。不要以为索引“越多越好”,什么东西都用索引是错的。每一个额外的索引都要占用额外的磁盘空间,并减少写操作的性能,这一点我们前面已经介绍过。在改动表的内容时,索引必须进行更新,有时可能须要重构,因此,索引越多,所花的时间越长。假设有一个索引非常少利用或从不使用,那么会不必要地减缓表的改动速度。此外,MySQL 在生成一个运行计划时,要考虑各个索引,这也要费时间。创建多余的索引给查询优化带来了很多其它的工作。索引太多,也可能会使MySQL 选择不到所要使用的最好索引。仅仅保持所需的索引有利于查询优化。假设想给已索引的表添加索引,应该考虑所要添加的索引是否是现有多列索引的最左索引。假设是,则就不要费力去添加这个索引了,由于已经有了。

        6. 考虑在列上进行的比較类型。索引可用于“ <”、“ < = ”、“ = ”、“ > =”、“ >”和BETWEEN 运算。在模式具有一个直接量前缀时,索引也用于LIKE 运算。假设仅仅将某个列用于其它类型的运算时(如STRCMP( )),对其进行索引没有价值。

原文地址:https://www.cnblogs.com/zfyouxi/p/4300634.html