mysql查询时,抵消过大影响性能怎么处理

  

本文主要给大家介绍mysql查询时,抵消过大影响性能怎么处理,文章内容都是笔者用心摘选和编辑的,具有一定的针对性、对大家的参考意义还是比较大的、下面跟笔者一起了解下mysql查询时,抵消过大影响性能怎么处理吧。

准备测试数据表及数据

1。创建表

<>之前创建表的成员(“id”int(10)无符号不是零AUTO_INCREMENT,“名字”varchar (10) NOT NULL评论& # 39;姓名& # 39;,“性别”非常小的整数(3)无符号NOT NULL评论& # 39;性别& # 39;,主键(id),关键的“性别”(“性别”)   )引擎=InnoDB默认字符集=utf8;

2。插入1000000条记录

 & lt; php ?
  pdo美元=new pdo (“mysql:主机=localhost; dbname=user",“root", & # 39; & # 39;); ($ i=0;i<美元;1000000;我+ +){name=美元substr (md5(时间().mt_rand (000999)), 0, 10);性别=美元mt_rand (1、2);$ sqlstr=安迦氤稍?姓名,性别)值(& # 39;“。美元的名字!”& # 39;,& # 39;“。性别美元霸主地位;& # 39;)“;=$美元支撑pdo→准备($ sqlstr);美元支撑→执行();}
  ?祝辞mysql>从成员选择count (*);
  + - - - - - - - - - - - +(*)| |计数
  + - - - - - - - - - - - + | 1000000 |
  + - - - - - - - - - - - + 1行组(0.23秒)


3。当前数据库版本

 mysql>选择版本();
  + - - - - - - - - - - - - +()| |版本
  + - - - - - - - - - - - - + | 5.6.24 |
  + - - - - - - - - - - - - + 1行组(0.01秒)

 mysql查询时,抵消过大影响性能怎么处理

分析抵消过大影响性能的原因

1.抵消较小的情况

 mysql>从成员选择*性别=1限制10,1;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - + +性别| | | | id名称
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 26 | | 509 e279687 | 1 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1行组(0.00秒)mysql>从成员选择*性别限制=100,1;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +性别| | | | id名称
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | 211 | 07 c4cbca3a | 1 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1行组(0.00秒)mysql>从成员选择*性别限制=1000,1;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +性别| | | | id名称
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | 1975 | e95b8b6ca1 | 1 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1行组(0.00秒)

当抵消较小时,查询速度很快,效率较高。
,
2.抵消较大的情况

 mysql>从成员选择*性别限制=100000,1;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +性别| | | | id名称
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | 199798 | 540 db8c5bc | 1 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1行组(0.12秒)mysql>从成员选择*性别限制=200000,1;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +性别| | | | id名称
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | 399649 | 0 b21fec4c6 | 1 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1行组(0.23秒)mysql>从成员选择*性别限制=300000,1;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +性别| | | | id名称
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | 599465 | f48375bdb8 | 1 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1行组(0.31秒)

当抵消很大时,会出现效率问题,随着抵消的增大,执行效率下降。

分析影响性能原因

 select *从成员性别=1限制300000年1;

因为数据表是InnoDB,根据InnoDB索引的结构,查询过程为:

<李>

通过二级索引查到主键值(找出所有性别=1的id)。

<李>

再根据查到的主键值通过主键索引找到相应的数据块(根据id找出对应的数据块内容)。

<李>

根据偏移量的值,查询300001次主键索引的数据,最后将之前的300000条丢弃,取出最后1条。

不过既然二级索引已经找到主键值,为什么还需要先用主键索引找到数据块,再根据偏移量的值做偏移处理呢?

如果在找到主键索引后,先执行抵消偏移处理,跳过300000条,再通过第300001条记录的主键索引去读取数据块,这样就能提高效率了。

如果我们只查询出主键,看看有什么不同

 mysql>从成员在性别选择id=1 300000年限制,1;
  + - - - - - - - - - - | + | id
  + - - - - - - - - - - + | 599465 |
  + - - - - - - - - - - + 1行组(0.09秒)

mysql查询时,抵消过大影响性能怎么处理