【每日一题】请总结一下MySQL索引优化的几个关键点
索引SET规范
尽量避免使用外键约束
不建议使用外键约束(foreign key),但一定要在表与表之间的关联键上建立索引
外键可用于保证数据的参照完整性,但建议在业务端实现
外键会影响父表和子表的写操作从而降低性能
优先考虑使用覆盖索引
覆盖索引:就是包含了所有查询字段 (where,select,ordery by,group by 包含的字段) 的索引
覆盖索引的好处:
避免 Innodb 表进行索引的二次查询: Innodb 是以聚集索引的顺序来存储的,对于 Innodb 来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询 ,减少了 IO 操作,提升了查询效率。
可以把随机 IO 变成顺序 IO 加快查询效率: 由于覆盖索引是按键值的顺序存储的,对于 IO 密集型的范围查找来说,对比随机从磁盘读取每一行的数据 IO 要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的 IO 转变成索引查找的顺序 IO。
单张表索引数量不要超过5个
索引并不是越多越好!索引可以提高效率同样可以降低效率。
索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。
因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能
控制表的宽度
MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节。
减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO);
更有效的利用缓存,避免读入无用的冷数据;
经常一起使用的列放到一个表中(避免更多的关联操作)。
尽可能将字段设置为NOT NULL
原因:
索引 NULL 列需要额外的空间来保存,所以要占用更多的空间
进行比较和计算时要对 NULL 值做特别的处理
财务相关金额类数据必须使用decimal类型
非精准浮点:float,double
精准浮点:decimal
Decimal 类型为精准浮点数,在计算时不会丢失精度
占用空间由定义的宽度决定,每 4 个字节可以存储 9 位数字,并且小数点要占用一个字节
可用于存储比 bigint 更大的整型数据
劝学警言
身处信息爆炸时代,知识浩瀚如海洋。
然,如同图书馆,你可以入门,但不代表你就拥有它。
且,学而不思则罔,思而不学则殆;
学贵有恒,更需注重方式方法。切记三字箴言:恒、慢、悟——
恒:坚持不懈!最忌讳的就是三天打鱼两天晒网,一曝十寒;
慢:精雕细琢!慢工出细活,理论知识一定要吃透,知其所以然;
悟:明辨慎思!要善于固化知识,一定要有自己的理解,否则就如同将他人吐在地上的吃过的甘蔗,再捡起来嚼,味同嚼蜡一般,无任何滋味可言。
送君一句话:殚精竭虑,不如须臾之所学也。
愿君,好好学习,天天向上!
共勉之!