索引注意事项
(1)最左前缀原则
若是查询的时候,查询条件精确匹配索引的左边连续一列或几列,则能够命中索引。
(2)避免where 子句中对字段施加函数,如to_date(create_time)>xxxxxx,这样会形成没法命中索引。
(3)在使用InnoDB 时,使用与业务无关的自增主键做为主键,即便用逻辑主键,而不要使用业务主键。
(4)合理利用索引覆盖
覆盖索引(Covering index)指一个查询语句的执行,只须要从辅助索引中就能够获得查询记录,而不须要查询汇集索引中的记录,也能够称之为实现了索引覆盖。
简单来讲,就是查询条件命中了索引,而查询字段也属于索引中的字段。
当实现了覆盖索引的时候,explain 命令的Extra 会显示 using Index。
(5)避免冗余索引
能够查询sys 库的schemal_redundant_indexes 表来查看冗余索引。
(6)将打算加索引的列设置为 NOT NULL,不然将致使引擎放弃使用索引,而进行全表扫描。
(7)删除长期未使用的索引
能够查询sys 库的 schema_unused_indexes 视图来查询从未使用过的索引。
(8)联表查询,也能够使用索引:
(9)查询条件的字段应使用正确的数据类型,不然MySQL 会自动作类型转换,致使没法命中索引。
索引的代价:
1. 索引文件自己要消耗存储空间;
2. 在被索引的表上,INSERT/DELETE 会变慢;
3. MySQL在运行是,也要消耗资源维护索引;