mysql 模糊查询不使用索引?explain显示用到索引 5C

创建了一个test_demo表,在其中加了5000+条数据

 SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `tb_test`;
CREATE TABLE `tb_online_disk_mgmt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `node_name` varchar(512) NOT NULL COMMENT '节点名称',
  `node_level` tinyint(4) NOT NULL COMMENT '节点所在层',
  `area_code` int(11) NOT NULL COMMENT '区域代码',
  PRIMARY KEY (`id`),
  KEY `area_level_name` (`area_code`,`node_level`,`node_name`(255)) USING BTREE,
  KEY `area_name` (`area_code`,`node_name`(255))
)
模糊查询不会使用索引,会进行全表查询。在mysql5.5中进行试验。通过结果对比的确可以看出like "%xxx%"这种是没有使用索引,进行了全表查询的,但是key为什么会显示area_level_name呢?正常的在进行全表扫描的时候,没有用到索引,key不用改为空吗?

使用explain对select进行解释

8个回答

求帮助~~~不要沉....

extra 没有Using index啊,你用主键查找肯定有Using index

believe__dream
neverR-M 这个问题,你说我也发现了,第一个sql两个查询条件都是被索引覆盖了,但是extra却没有显示useing index.......这个又是因为什么啊....
一年多之前 回复
believe__dream
neverR-M 这个没有用主键查找,第一个sql使用 like "me%" 只查了一行,这个是用了索引的,key显示的area_name也是正确的,第二个使用like "%me%" 是没有用索引,查了全表,这里也是正确的,但是key显示area_level_name这个索引,我不能理解这里
一年多之前 回复
believe__dream
neverR-M 这个没有用主键查找,第一个sql
一年多之前 回复

有Using index啊,你用主键查找肯定有Using

believe__dream
neverR-M 对啊,第一个sql为什么extra里边没有显示using index....啊啊啊啊!....好无语
一年多之前 回复

Using index忘记了吧

believe__dream
neverR-M 你这个是什么意思呢?我没理解到~
一年多之前 回复

using index :使用覆盖索引的时候就会出现
using where:在查找使用索引的情况下,需要回表去查询所需的数据

这个是网上解释 ,意思就是两个sql都用到了索引,但是第二个不是应该不会用到吗??

%开头的模糊查询,会导致全表扫描

believe__dream
neverR-M 是全表扫描,但是通过explain显示是使用到索引了的,我就是这里不明白..
一年多之前 回复
像like 'me%'  这个百分号之前还是有用到索引的  匹配开头两个字母命中的这些数据用到 KEY `area_name` (`area_code`,`node_name`(255)
这个索引
like '%me%' 这个 条件不能使用到索引  但是 你这个条件之前的 area_code=10 是可以用 KEY `area_name` (`area_code`,`node_name`(255) 索引的  
believe__dream
neverR-M 谢谢!!按照你说的我实验了一下,是这样的。还有一个问题,第一个是使用了覆盖索引,为什么extra里边显示的useing where,不应该是useing index吗?
一年多之前 回复

可以用啊,只要%不在字段前面就可以的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!