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+树,但其实它还支持另一种索引:自适应哈希索引. 哈希表是数组+链表的形式.通过哈希函数计算每个节点数据中键所对应的哈希桶位置,如果出现哈希冲突,就使用拉链法来 ...
随机推荐
- Http API触发小程序云函数案例
1.创建云函数 在云开发中创建云函数(sum,调用需要两个参数:a.b): 2.invokeCloudFunction触发云函数 const request = require('request'); ...
- elsearch搜索引擎 + painless脚本语言入门
最近项目用到了elsearch,ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎. 自从版本6.0之后,其默认脚本语言变为 painless . ...
- Linux物理磁盘扩容流程
1. 插入硬盘前,查看现有硬盘情况 (1)命令:fdisk -l 说明:fdisk -l 查看设备的所有分区 (2)命令:df -h 说明:df 列出文件系统的整体磁盘使用量 2. 断电插入硬盘后,重 ...
- 防止或减少过拟合的方式(二)——Dropout
当进行模型训练的时候,往往可能错过模型的最佳临界点,即当达到最大精度的时候再进行训练,测试集的精度会下降,这时候就会出现过拟合,如果能在其临界点处提前终止训练,就能得到表达力较强的模型,从而也避免了过 ...
- requests库爬取需要登录的网站
#!usr/bin/env python #-*- coding:utf-8 _*- """ @author:lenovo @file: 登录人人网.py @time: ...
- P1000题解 超级玛丽游戏
P1000这么难,必须要水一篇题解/斜眼笑 ******** ************ ####....#. #..###.....##.... ###.......###### ### ### .. ...
- 吴裕雄--天生自然 R数据分析:2014年美国人时间使用调查(ATUS)饮食与健康模块文件分析
# libraries we'll need library(car) # for avplots library(tidyverse) # for general utility functions ...
- linq行转列
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...
- 对Linux内核tty设备的一点理解(转)
虽然一直做嵌入式Linux,宿主机和开发板通信天天都在用tty设备通信,但是其实自己对TTY设备及终端的概念认识几乎是0.对于Linux内核的终端.tty.控制台等概念的认识很模糊.由于在学习的时候碰 ...
- H5_0027:Layer使用
1,提示 document.getElementById("cloWd").onclick = function(){ layer.confirm('您确定要关 ...