创建高性能的索引
索引可以让服务器快速定位到表的位置,附加作用,B-Tree索引,按照顺序排序,所以mysql可以 order by 和group by操作。因为数据是有序的,所以B-TREE也会将相关列值都存储在一起。索引中存储了实际的列值索引使用索引就能完成全部查询。
总结索引的优点:
1.索引大大减少服务器扫描的数据量
2.索引可以帮助服务器避免排序和临时表
3.索引可以将随机IO变为顺序IO
索引是最好的解决方案吗?
索引不是最好的工具,但索引能够帮助存储引擎快速找到记录带来的好处。高效的索引才是有效的。小的表全表扫描更有效。中大型表,索引非常有效,但对于特大型表,建立和使用索引的代价随之增长,这种情况下,可以使用分区分出查询的一组数据,而不是一条一条的记录匹配。
高性能索策略
独立的列
是指索引的列不是表达式的一部分,也不是函数的参数
--------> select actor_id from actor where actor_id+1=5;
where的表达式等价于 actor_id=4,mysql无法解析这个方程式,用户行为,应该始终将索引单独放在比较符号的一侧
前缀索引和索引的选择性
为什么需要??????----------->有时需要索引很长的字符列,这会让索引变得大且慢。
即可以索引开始部分字符,这样可以节约索引的空间,提高索引的效率,但这样会降低索引的选择性(扫描的前缀越短,重复越多,叶子节点也就越多)。
选择性---------> 不重复的索引值/数据表记录总数(#T) 范围1/#T 到1之间。唯一索引的选择性是1.这是最好的索引选择性,性能最好。
选择足够长的浅醉保证比较高的选择性,同时又能太长(以便节约空间),前缀的基数应该接近于完整列的基数
不能光看平均选择性,也要看数据分布的均匀性。
平均选择性
数据均衡展示
创建前缀索引:----------> ALTER TABLE city_demo add key(city(7));
缺点:无法使用前缀索引做order by 和group by,也无法使用前缀索引做覆盖扫描
为什么?-------->因为不是对整个字段做索引,所以无法按照顺序进行存储数据
数据参考:https://www.cnblogs.com/gomysql/p/3628926.html