数据库优化:运算后的列,不能使用索引

一、确认数据库索引信息

MySQL [bonnie]> show index from user;

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user  |          0 | PRIMARY  |            1 | id          | A         |     4979256 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

二、 实际场景

查询语句中,存在运算符。实际运算后的列,不能使用索引

2.1 确认“ select * from user where id+1=2;”的执行过程

explain select * from user where id+1=2;

+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 4979256 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)

执行该条语句,需要遍历4979256 行数据
type是all

2.2 实际执行查看运行时间

select * from user where id+1=2;

+----+-------+-----+-----+---------------+---------+------------+------------+
| id | name  | sex | age | email         | address | company    | city       |
+----+-------+-----+-----+---------------+---------+------------+------------+
|  1 | PlNej |   1 |  77 | TbCFvn@qq.com | bu      | 1604932650 | 1604932650 |
+----+-------+-----+-----+---------------+---------+------------+------------+
1 row in set (2.62 sec)

实际运行后,一条语句运行了2s+

2.3 对比,看下不加计算的运行效果

 select * from user where id=1;
+----+-------+-----+-----+---------------+---------+------------+------------+
| id | name  | sex | age | email         | address | company    | city       |
+----+-------+-----+-----+---------------+---------+------------+------------+
|  1 | PlNej |   1 |  77 | TbCFvn@qq.com | bu      | 1604932650 | 1604932650 |
+----+-------+-----+-----+---------------+---------+------------+------------+
1 row in set (0.01 sec)

去掉运算“+”,直接给出运算结果,一条语句只执行了0.01s

2.3 对比,看下不加计算的执行过程

explain select * from user where id=1;

+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | user  | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)

只需要查看1行,并切type的类型是const

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 13,284评论 0 44
  • 1、数据库介绍篇 1.1什么是数据库 数据库:保存数据的仓库。它体现我们电脑中,就是一个文件系统。然后把数据都保存...
    投石机阅读 4,106评论 0 0
  • 本文转自互联网 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 h...
    da3acf50377b阅读 1,891评论 0 2
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,720评论 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未来发展的必然趋势吗?以后人工智能技术真的能达到电影里机器人的智能水平吗...
    ZLLZ阅读 9,377评论 0 5