MySQL 中like的使用对于索引的影响
今天看了一篇对于like使用对索引的影响的文章,发现自己实践的跟文章得出结论不大一样。所以还是建议自己再看别人文章的时候自己亲自动手实践一下。以免学到不全面的知识。
列子:
先建立一张表:
-- 创建表
CREATE TABLE test(
id INT(11) NOT NULL AUTO_INCREMENT,
uname VARCHAR(255),
PRIMARY KEY(id)
);
再在uname字段上创建索引:
-- 添加索引
ALTER TABLE test ADD INDEX uname_index (uname);
-- 查看索引
SHOW INDEX FROM test;

-- 添加记录
INSERT INTO test VALUES((1,'jay'),(2,'ja'),(3,'bril'),(4,'aybar');
检测结果:
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';
这么看来 %的使用对索引似乎没有印象,但是再加一个普通不是索引的字段
--添加一个非索引字段
ALTER TABLE `test`
ADD COLUMN `status` int(11) UNSIGNED NULL DEFAULT 1 AFTER `uname`
再次检测:
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';
这次的结果是: like后直接跟%号的匹配的查询不使用索引;like后先跟匹配值%,就会使用到索引。
----疑问???
|那么为啥加了一个字段后会有这样的区别呢?之前的字段是id,uname id是主键,也是索引的一部分 所以select * 取的两个字段都是索引字段。所以 like 语句都会使用到索引。
后面加了一个非索引字段status,并且取数据列表里也存在status字段,所以%在匹配值前的情况就会受影响。
当然如果不是select * ,而是select id 或者select uname 再或者 select id,uname 都会使用上索引。
具体的还希望自己动手试一下哈。听到的不如看到的;看到的不如自己亲手实践出来的。
本人也在学习阶段,若有不正确不恰当的地方还希望能多多指教_!
MySQL 中like的使用对于索引的影响的更多相关文章
- 【转载】Mysql中的Btree与Hash索引比较
转载地址:http://www.jb51.net/article/62533.htm 这篇文章主要介绍了Mysql中的Btree与Hash索引比较,本文起讲解了B-Tree 索引特征.Hash 索引特 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- 关于mysql中like查询是否通过索引的测试
测试mysql的like语句是否通过索引时得到结果如下: 图片1: 图片2: 图片3: 通过上述3组图片我想大家很容易愤青我使用的'%8888888%','%8888888'和'8888888%'3中 ...
- MySQL中EXPLAIN解释命令 查看索引是否生效
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- Mysql中的Btree与Hash索引
B-Tree 索引特征 B-Tree索引可以被用在像=,>,>=,<,<=和BETWEEN这些比较操作符上.而且还可以用于LIKE操作符,只要它的查询条件是一个不以通配符开头的 ...
- mysql中explain查看sql语句索引使用情况
explain + sql: mysql> explain select * from user; +----+-------------+-------+------+------------ ...
- 搞定面试官 - MySQL 中你知道如何计算一个索引的长度嘛?
大家好,我是程序员啊粥. 今天给大家分享一个我遇到过的比较少见的面试题,那就是 MySQL 中如何计算一个索引的长度. 说实话,我第一次遇到这个问题的时候想当然的以为索引长度就是我们建表时定义的字段长 ...
- 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?
大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...
- MySQL中的自适应哈希索引
众所周知,InnoDB使用的索引结构是B+树,但其实它还支持另一种索引:自适应哈希索引. 哈希表是数组+链表的形式.通过哈希函数计算每个节点数据中键所对应的哈希桶位置,如果出现哈希冲突,就使用拉链法来 ...
随机推荐
- hadoop3自学入门笔记(1)——虚拟机安装和网络配置
前言 年过30惶惶不安,又逢疫情,还是不断学习,强化自己的能力.hadoop的视频和书籍在15年的时候就看过,但是一直没动手实践过,要知道技术不经过实战,一点提升也没有.因此下定决心边学边做,希望能有 ...
- lua学习之深入函数第一篇
深入函数第一篇 函数是第一类值,具有特定的词法域 第一类值 第一类值的意思是函数与 lua 中的其他类型如数字,字符串具有相同的权力 函数可以存储到全局变量或局部变量变量,还可以存储到 table 中 ...
- Docker总结2020
1. docker ps docker exec -it php7 /bin/bash 设置文件权限: chmod -R sign_tp5/ 重启nginx命令: nginx -s reload ...
- C#方法中的各类参数
居家隔离的第26天,还在持续的疫情着实让人担忧,看着每天新增的确认人数数字,也在为那些家庭祝福,每当想想那不是一个数字是一条条鲜活的生命时就格外沉重.利用闲在家里的时间巩固C#语言的一个难点.最近在温 ...
- JS隐藏显示图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- EasyUI表单验证插件扩展
$.extend($.fn.validatebox.defaults.rules, { regex: { validator: function (value, param) { var regex ...
- 关于GC(垃圾回收)
当我用new创建一个对象时,当可分配的内存不足GC就会去回收未使用的对象,但是GC的操作是非常复杂的,会占用很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能.下面的建议可以避免GC频繁操作 ...
- 小程序上拉触底&下拉加载
data: { pageNo: 1,//当前页 pageSize: 10,//每页条数 count:'',//总条数 orderList: [], }, onLoad: function () { v ...
- JavaScript自学笔记(3)--- 用JS来实现网页浮窗
最近做个小项目,给网页加个浮窗,考验了基础的css,js技术,还是蛮有意思的,代码如下(部分代码来源于引用,见底部) <!DOCTYPE html> <html> <he ...
- stream重复Key的处理
Map<String, List<Model>> modelMap = modelList .stream() .collect(Collectors .toMap(model ...