当前位置: 首页 > 科技观察

为什么你创建的数据库索引没有生效?_0

时间:2023-03-18 00:03:19 科技观察

几乎所有的朋友都能说说创建索引的优缺点,知道什么时候创建索引可以提高我们的查询性能,什么时候会更新索引,但是你有没有注意到,即使你设置了Indexed,有时候索引不会生效!这不仅考察了大家对索引的理解,也让大家在使用的时候能够正确使用。下面介绍一些可能导致索引失效的特殊情况。希望大家平时开发和面试的时候注意一下!1、如何判断数据库索引是否有效首先,在继续讨论之前,先说说如何判断数据库索引是否有效!相信大家应该已经猜到了,就是解释!explain显示了MySQL如何使用索引来处理选择语句和连接表。他可以帮助选择更好的索引,编写更优化的查询语句。比如我们有一张表user,为name列创建了一个索引name_index,如下图:使用explain语句分析如下:可以看到使用explain显示了很多列,每个关键字的含义如下:table:顾名思义,就是显示这一行的内容,数据是关于哪个表的;类型:这是一个重要的列,显示使用的连接类型。从***到worst的连接类型分别是:const、eq_reg、ref、range、indexhe和ALL;possible_keys:显示可能应用于此表的索引。如果为空,则没有可能的索引。可以从相关字段的where语句中选择合适的语句;key:实际使用的索引。如果为NULL,则不使用索引。在极少数情况下,MySQL会选择未优化的索引。这种情况下,可以在Select语句中使用USEINDEX(indexname)强制使用索引或者使用IGNOREINDEX(indexname)强制MySQL忽略该索引;key_len:使用的索引的长度。长度越短越好,不会损失精度;ref:显示索引的哪一列被使用,如果可能的话,是一个常量;rows:MySQL认为必须检查的行数才能返回请求的数据;Extra:关于MySQL如何解析查询的额外信息。具体每列可以代表的值和含义,请参考MySQL官方文档,地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html2.其中会导致索引生效的场景1.尽量避免在where子句中使用!=或<>操作符,否则引擎会放弃使用索引而扫描全表;2.尽量避免在where子句中使用ortoconnect条件,否则会导致引擎放弃使用索引而进行全表扫描。即使有带索引的条件,它也不会使用它们。这就是为什么应该尽可能少地使用or的原因;3、对于多列索引,如果不是用得最多的部分,则不会使用。指数;4、如果列类型是字符串,则条件中必须对数据进行引号,否则不会使用索引;5、like的模糊查询如果以%开头,索引会失败;6、尽量避免在where子句中对字段进行表达式操作,会导致引擎放弃使用索引而进行全表扫描;7、尽量避免在where子句中对字段进行函数操作,这样会导致引擎放弃使用索引而进行全表扫描;8、不要在where子句中的“=”左边进行函数、算术运算或其他表达式操作,否则系统可能无法正确使用索引;9、如果MySQL估计使用全表扫描比使用索引快,则不使用该索引;10、不适合键值较少的列(重复数据较多的列)。如果索引列TYPE有5个键值,如果有10000条数据,那么WHERETYPE=1会访问表中的数据2000个数据块。除了访问索引块外,一共需要访问200多个数据块。如果是全表扫描,假设每个数据块有10条数据,那么只需要访问1000个数据块。由于全表扫描访问的数据块较少,所以肯定不会使用索引。