前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL 条件字段有索引但是不走索引的场景

MYSQL 条件字段有索引但是不走索引的场景

作者头像
友儿
发布2022-09-11 14:31:09
1.7K0
发布2022-09-11 14:31:09
举报
文章被收录于专栏:友儿
首先创建测试表,建表及数据写入语句如下:
代码语言:javascript
复制
use muke;                       /* 使用muke这个database */

drop table if exists t1;        /* 如果表t1存在则删除表t1 */

CREATE TABLE `t1` (             /* 创建表t1 */
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` varchar(20) DEFAULT NULL,
  `b` int(20) DEFAULT NULL,
  `c` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
  PRIMARY KEY (`id`),
  KEY `idx_a` (`a`) USING BTREE,
  KEY `idx_b` (`b`) USING BTREE,
  KEY `idx_c` (`c`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

drop procedure if exists insert_t1; /* 如果存在存储过程insert_t1,则删除 */
delimiter ;;
create procedure insert_t1()        /* 创建存储过程insert_t1 */
begin
  declare i int;                    /* 声明变量i */
  set i=1;                          /* 设置i的初始值为1 */
  while(i<=10000)do                 /* 对满足i<=10000的值进行while循环 */
    insert into t1(a,b) values(i,i);  /* 写入表t1中a、b两个字段,值都为i当前的值 */
    set i=i+1;                        /* 将i加1 */
  end while;
end;;
delimiter ;
call insert_t1();                    /* 运行存储过程insert_t1 */

update t1 set c = '2019-05-22 00:00:00';  /* 更新表t1的c字段,值都为'2019-05-22 00:00:00' */
update t1 set c = '2019-05-21 00:00:00' where id=10000;     /* 将id为10000的行的c字段改为与其它行都不一样的数据,以便后面实验使用 */
1. 函数操作
1.1 不走索引的原SQL:
代码语言:javascript
复制
select * from t1 where date(c) ='2019-05-21';
1.2 优化后走索引的SQL:
代码语言:javascript
复制
select * from t1 where c>='2019-05-21 00:00:00' and c<='2019-05-21 23:59:59';
2. 隐式转换
2.1 不走索引的原SQL:
代码语言:javascript
复制
select user_name,tele_phone from user_info where tele_phone =11111111111; /* SQL 1 */
2.2 优化后走索引的SQL:
代码语言:javascript
复制
select user_name,tele_phone from user_info where tele_phone ='11111111111';
3. 模糊查询
3.1 不走索引的原SQL:
代码语言:javascript
复制
select * from t1 where a like '%1111%';
3.2 优化后走索引的SQL(结果不一定准确):
代码语言:javascript
复制
select * from t1 where a like '1111%';
3.3 或者使用搜索服务器 (如果条件只知道中间的值,需要模糊查询去查,那就建议使用ElasticSearch、SPHINX或者其它搜索服务器。)
4. 范围查询
4.1 不走索引的原SQL:
代码语言:javascript
复制
select * from t1 where b>=1 and b <=2000;
4.2 优化后走索引的SQL:
代码语言:javascript
复制
select * from t1 where b>=1 and b <=1000;
select * from t1 where b>=1001 and b <=2000;
5. 计算操作
5.1 不走索引的原SQL:
代码语言:javascript
复制
select * from t1 where b-1 =1000;
5.2 优化后走索引的SQL:
代码语言:javascript
复制
select * from t1 where b =1000 + 1;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先创建测试表,建表及数据写入语句如下:
  • 1. 函数操作
    • 1.1 不走索引的原SQL:
      • 1.2 优化后走索引的SQL:
      • 2. 隐式转换
        • 2.1 不走索引的原SQL:
          • 2.2 优化后走索引的SQL:
          • 3. 模糊查询
            • 3.1 不走索引的原SQL:
              • 3.2 优化后走索引的SQL(结果不一定准确):
                • 3.3 或者使用搜索服务器 (如果条件只知道中间的值,需要模糊查询去查,那就建议使用ElasticSearch、SPHINX或者其它搜索服务器。)
                • 4. 范围查询
                  • 4.1 不走索引的原SQL:
                    • 4.2 优化后走索引的SQL:
                    • 5. 计算操作
                      • 5.1 不走索引的原SQL:
                        • 5.2 优化后走索引的SQL:
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档