MySQL什么时候不走索引,建立索引的原则规范?

回答·11
最热
最新
  • MySQL 什么时候不走索引? 主要三种情况 1、不满足走索引的条件,常见的情况有 1.1、不满足最左匹配原则 1.2、查询条件使用了函数 1.3、or 操作有一个字段没有索引 1.4、使用 like 条件以%开头 2、走索引效率低于全表扫描,常见的情况有 2.1、查询条件对 null 做判断,而 null 的值很多 2.2、一个字段区分度很小,比如性别、状态 3、需要回表的查询结果集过大,超过了配置的范围 在 mysql 中创建索引的原则有以下几点: 1、表的主键、外键必须有索引; 2、经常与其他表进行连接的表,在连接字段上应该建立索引; 3、选择唯一性索引; 4、对于查询频率高的字段创建索引; 5、对排序、分组、联合查询频率高的字段创建索引; 6、尽量使用前缀来索引; 7、索引应该建在选择性高的字段上,在选择性低的字段上不必要建立索引,如性别字段; 8、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 9、索引列不能参与计算,保持列“干净”; 10、对于定义为 text、image 和 bit 的数据类型的列不要建立索引; 11、若在实际中,需要将多个列设置索引时,可以采用多列索引; 12、一个表的索引的数目不宜太多; 13、删除不再使用或者很少使用的索引,避免对执行计划造成负面影响;
  • 1.如果表里的索引都没有建,当然也就不会走索引 2.如果建的是复合索引必须符合最左原则,否则不能全部走索引,或只能走某个索引。 3.写 where 语句时,在建立索引的字段上的值=mysql 内置函数计算出来的值或用 like 条件并以%开头的也会不走索引 3.如果获取的数据结果集非常的多需要大量到回表操作,成本已经超过了走索引的成本,也就自然不会走索引了,一般会发生在 select*from xxx where a>xxx 这样的 sql 语句中 5.走不走索引最好的判断方法就是用 explain 去看看 sql 语句的执行计划了 建立索引的规范 1.在建立索引的字段,其值不能有大量重复,重复性越低越好,比如 sex 字段上的值只有男或女这二个值,那么这个字段就不适合了 2.在字符串类型的字段上建立索引要建立前缀索引,不能把整个字段的值都建立索引 3.表上不能建很服多的索引,所以最好建立复合索引,一般不要超过 4 个。
  • 以下都是基于 innodb 为前提的。 不走索引的情况:   -  mysql 优化器选错了索引   - 本身 sql 就不包含索引    - like 语句错误    - 索引本身区分度不高,直接走了全表了    - 调用函数,条件字段的字符集不同,条件字段进行类型转换,其实最终都会进行函数调用的    - 联合索引的时候,没有遵循最左选择   - 字符串建立索引,没有走左前缀匹配原则    - 运算符会导致索引实现 如 where a - 1=58    - or 的条件字段不一样    建立索引原则 - 索引字段区分度要高  - 主键索引长度要小,减少存储空间,因为非主键索引叶子节点存储的都是主键值,当然非主键索引也要尽量小,都是为了减少存储空间,这样节点就可以存放更多的数据,减少层高,进而减少磁盘 io - 尽量减少回表,可以使用覆盖索引和索引下推 - 如果建立联合索引,在支持最左原则的前提下,不要建立过多的索引,如果建立了 a b c 联合索引,那么 a 索引 ,a b 索引就不需要在建立了。
  • 问题一,不走索引的情况有很多 1.索引的列使用的高数或者算数等式 2.索引列判断的条件为 null 3.字符集问题,引擎隐式转换字符集 4.查询条件使用了 or 5.不满意最左前缀的规则 6.满足最左前缀但最左前缀使用了范围查询 7.索引的基数不够大,优化器认为不走索引的消耗比走索引的消耗小 7.数据量较小时,飞主键索引的范围查询时,因为有回表的机制,有时候会让优化器认为走索引消耗更大 8.因为扫描的行数 rows 是预估的,错误的评估了 rows 这个参数,也会造成不走索引,比如会话 a 开启事物的同时会话 b 在执行 delete 问题二,我认为建立索引的选择是尽量选择应用程序频率较高的 sql 做参照,同时选择基数大,避免不用的索引,比如 ab 联合索引和 a 索引这种,a 就是个重复的索引
  • 遵从从左原则,不走索引,临时表,like 左边存在%,where 条件使用了运算或者函数
  • 聚焦索引,普通索引。还有 mysql 回表问题。这都是检索新需要考虑的问题。
  • group by order by 非索引时
  • 索引通常用于解决慢 sql,有慢 sql 后根据情况加索引。
  • 不建立索引的时候,就不走索引吧!查询字段上建立索引就应该走吧。不同的数据库系统是人家规定的,人家系统设计的时候让它走它就走。咱们只是应用而已,依据人家的规则,有的数据库系统可能根本就不走索引了在有缓存的时候。无需多虑。
  • MySQL 在以下情况下不使用索引:1、查询中使用了不支持索引的函数;2、查询的列中有 null 值;3、使用了 OR 操作符。建立索引的原则:1、在经常使用的查询字段上建立索引;2、只对那些经常使用到的查询条件进行索引;3、在多列上建立联合索引;4、建立索引时注意字符长度;5、避免在频繁更新的列上建立索引。