本文主要给大家介绍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秒)
分析抵消过大影响性能的原因
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查询时,抵消过大影响性能怎么处理