(1)回顾
    上面讲了索引设计的时候如何根据你的查询语句来设计,让你的查询语句都能用上索引,另外还将了字段基数的问题以及前缀索引的问题,其实就是设计索引时尽量别把基数很低的字段包含进去,同时针对很长的字符串类型的字段,可以设计前缀索引进行where查询。

    (2)条件函数与索引
    例如SQL where function(a) = xx,在索引里的字段a套了一个函数,这个时候是没有用到索引的,所以尽量不要让查询语句里的字段使用函数,或者计算。现在设计索引的时候需要注意的点都已经说完,就是好好设计索引,让查询语句都用上索引,同时注意下字段基数,前缀索引和索引列套函数问题,尽量让查询都能用索引,别因为一些原因用不上索引。

    (3)其他关键点
    设计索引不要太多,建立两三个索引就应该覆盖你这个表的全部查询了。否则索引太多必然导致增删改数据的时候性能很差劲,因为要维护索引树。
    另外一个关键点,建议设置主键为自增,别用UUID之类的,因为主键自增,聚簇索引就不会频繁的分裂,主键值是有序的,就会自然的新增一个页而已,但是如果使用uuid,那么也会导致聚簇索引频繁的页分裂。

    对于复杂的SQL如何建索引?
    建议把一条极为复杂的大SQL,拆分为多条小SQL来执行,同时有些逻辑可以放代码里做。连表left join一般不超过3张表,如果超过三张表,可以对SQL语句进行拆分,效率不太很低,另外过于复杂的连表操作需要对表结构重新设计。
    通过冗余字段减少表与表之间的关联查询,多次查询SQL降低效率,是建立在SQL执行时间一样的前提下,实际情况中,一个长sql跟两个单sql占用的资源可能差不多,甚至一个长sql占用的资源会更多。

    针对字段的数据类型的选择,使用什么样的类型建立索引好呢?
    一般状态字段tinyint,主键bigint,字符串类型根据固定长度和可变长度来选择char和varchar ,时间字段datetime和timestamp都可以

    如果一个基数大一个基数小的建立索引该怎样建立?是两个建立一个联合索引好还是建立基数大的索引好?
    一般联合索引的效率高一点

    为什么索引的长度一般设计为2的幂次方?
    因为索引的数据是通过字节存储的。不用做填充比如 varchar(255)用一个8bit来存储。