mysql 添加索引卡死_mysql添加索引,查询反而变慢

mysql 添加索引卡死_mysql添加索引,查询反而变慢依照楼主的数据,我也造了400万数据:mysql>select*fromindex_testlimit5;id1id211111111112222222222111111111122222222221111111111id1创建索引执行确实是id2谓词条件比较快:mysql>select*fromindex_testwhereid1=11111;2097152…

大家好,又见面了,我是你们的朋友全栈君。

依照楼主的数据,我也造了400万数据:

mysql> select * from index_test limit 5;

id1

id2

11111

11111

22222

22222

11111

11111

22222

22222

11111

11111

id1创建索引

执行确实是id2谓词条件比较快:

mysql> select * from index_test where id1=11111;

2097152 rows in set (3.00 sec)

mysql> select * from index_test where id2=11111;

2097152 rows in set (2.32 sec)

id1的profile是这样的:

+———————-+———-+

| Status | Duration |

+———————-+———-+

| starting | 0.000080 |

| checking permissions | 0.000014 |

| Opening tables | 0.000024 |

| init | 0.000033 |

| System lock | 0.000015 |

| optimizing | 0.000018 |

| statistics | 0.035408 |

| preparing | 0.000033 |

| executing | 0.000007 |

| Sending data | 2.963681 |

| end | 0.000021 |

| query end | 0.000015 |

| closing tables | 0.000020 |

| freeing items | 0.003474 |

| logging slow query | 0.000117 |

| cleaning up | 0.000072 |

+———————-+———-+

id2的profile是这样的:

Status

Duration

starting

0.000074

checking permissions

0.000012

Opening tables

0.000025

init

0.000032

System lock

0.000014

optimizing

0.000018

statistics

0.000025

preparing

0.000019

executing

0.000006

Sending data

2.318096

end

0.000020

query end

0.000034

closing tables

0.000022

freeing items

0.004327

logging slow query

0.000093

cleaning up

0.000060

可以看到id1耗时相对显著的是statistics,Sending data,主要集中在Sending data。

Sending data

The thread is reading and processing rows for a SELECT statement, and sending data to the client。

也就是说,id1=11111比id2=11111花费更多的时间在数据读取上。而id1上的是二级索引,用到该索引还有一个回表的花销,在这种数据基数小,索引的选择性就太差,这种情况不应该使用索引。

如果非要使用索引,就要避免回表,创建覆盖索引。

alter table index add index com_idx(id1,id2);

测试结果就可以看到id1=11111比id2=11111快了:

mysql> select * from index_test where id1=11111;

2097152 rows in set (1.71 sec)

mysql> select * from index_test where id2=11111;

2097152 rows in set (2.57 sec)

对应profile如下:

id1=11111

Status

Duration

starting

0.000149

checking permissions

0.000084

Opening tables

0.000032

init

0.000026

System lock

0.000013

optimizing

0.000013

statistics

0.000198

preparing

0.000019

executing

0.000006

Sending data

1.710508

end

0.000024

query end

0.000015

closing tables

0.000019

freeing items

0.003275

logging slow query

0.000068

cleaning up

0.000025

id2=11111

Status

Duration

starting

0.000066

checking permissions

0.000012

Opening tables

0.000020

init

0.000024

System lock

0.000011

optimizing

0.000013

statistics

0.000021

preparing

0.000015

executing

0.000006

Sending data

2.566770

end

0.000025

query end

0.000077

closing tables

0.000034

freeing items

0.004227

logging slow query

0.000093

cleaning up

0.000018

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142994.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 回顾IDEA全局搜索快捷键

    回顾IDEA全局搜索快捷键Ctrl+Shift+F就可以进行全局搜索。注意如果安装了搜狗输入法,可能存在热键冲突。

    2022年6月18日
    54
  • getattr getattribute_getparameter返回值

    getattr getattribute_getparameter返回值问题描述今天开发验证码验证功能,需要将手机号和对应的验证码设置到session中以便后面的验证,具体代码如下:1.发送验证码并把验证码保存到session中protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresponse)throwsServletException,IOException{ try{mresponse=response;St

    2025年6月19日
    4
  • 少儿编程150讲轻松学Scratch(二)-制作过马路小游戏

    少儿编程150讲轻松学Scratch(二)-制作过马路小游戏前言今天为大家带来一款小游戏的制作教程,只要跟着步骤做,就能轻松地制作出属于自己的过马路小游戏。家长们可以用此教程指导孩子逐步完成,然后一起测试和游玩,再一起探究每处代码的逻辑意义。教程教程如下:打开Scratch程序后,默认就会有一只小猫角色,我们就使用它当我们游戏的主角,然后再添加一个汽车角色。而后编辑汽车的造型,点击右键菜单的复制命令,复制一个新的造型。在新造型右上角,点击左右翻转按钮,使车子翻转到车头向左。再分别修改两个造型的名称为A和B。然后新建角色私有的变量

    2022年6月19日
    29
  • 排序算法:归并排序、快速排序

    排序算法:归并排序、快速排序

    2021年10月5日
    46
  • Vue项目关于eslint

    Vue项目关于eslint  新公司的Vue项目没有配置eslint,虽然平时coding的时候都会按照eslint的标准去写,但是没有统一的配置后期项目代码review的时候总还是不太方便。  Vue的项目配置eslint还是很简单的。它属于依赖插件中的一种,可以像安装其他插件一样在命令行用npminstalleslint-g安装,也可以修改package.json文件去更新项目的依赖包,重新跑一遍npm…

    2022年6月18日
    28
  • import sun.misc.BASE64Encoder;报错

    import sun.misc.BASE64Encoder;报错详情见:https://blog.csdn.net/Carrie_zzz/article/details/78821469当我们要兼容火狐浏览器的时候需要用到BASE64Encoder。此时要导入这个包importsun.misc.BASE64Encoder;莫名奇妙的错了。这是因为这个类不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。但是在eclipse中直接使用却报…

    2022年6月25日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号