innodb count优化测试

  对于索引优化真的是门课题,先来研究下最平常的问题,innodb引擎下 怎么让count(*)快一点。

  首先需要清楚

  innodb 默认是对主键建立聚簇索引,如果没有主键,那就是对具有唯一且非空值的索引来代替,如果也没有,innodb内部就会自己维护一个这样的索引。

聚簇索引存的是索引+数据,二级索引存的是对主键即聚簇索引的指向。

  所以通过上面的猜想

  1.表中聚簇索引如果有varchar,text的字段,如果存储数据比较多,聚簇索引就会非常的大,就会照成大量数据页分裂。(这里数据页是什么,我也理解的不是很深刻,请自行百度)

  2.根据二级索引去count(*) 会快很多。

  想到就干,开始实践

#只有基本的字段
create table a1(
    id int not null auto_increment,
    user_name varchar(20) not null,
    user_pwd char(32) not null,
    regtime datetime not null default CURRENT_TIMESTAMP,
    primary key (id)
)charset=utf8;

#有个varchar(255)这样存大数据的字段
create table a2(
    id int not null auto_increment,
    user_name varchar(20) not null,
    user_pwd char(32) not null,
    description varchar(255) not null comment ‘描述‘,
    img_url varchar(255) not null comment ‘头像地址‘,
    regtime datetime not null default CURRENT_TIMESTAMP,
    primary key (id)
)charset=utf8;  
#建立存储过程写入50w条数据
DELIMITER //
create procedure insert_a(in t int)
begin
    set @num=1;
    if t=2 then
        set @description = ‘工作式的自我介绍的内容,应当包括本人姓名、供职的单位及其部门、担负的职务或从事的具体工作等三项。他们叫作工作式自我介绍内容的三要素,通常缺一不可。其中,第一项姓名,应当一口报出,不可有姓无名,或有名无姓。第二项供职的单位及其部门,有可能最好全部报出,具体工作部门有时也可以暂不报出。第三项担负的职务或从事的具体工作,有职务最好报出职务,职务较低或者无职务,则可报出所从事的具体工作。‘;
        set @img_url = ‘https://gss1.bdstatic.com/5eN1dDebRNRTm2_p8IuM_a/res/img/0617jd.jpg‘;
    end if;

    while @num<=500000 do
        if t=1 then
            insert into a1 (user_name,user_pwd) values(concat(‘user‘,@num),‘e10adc3949ba59abbe56e057f20f883ezc‘);
        else
            insert into a2 (user_name,user_pwd,description,img_url) values(concat(‘user‘,@num),‘e10adc3949ba59abbe56e057f20f883ezc‘,@description,@img_url);
        end if;
        set @num=@num+1;
    end while;
end //

DELIMITER ;

CALL insert_a(1);
CALL insert_a(2);

  准备工作都已经做好了

  1.首先通过以下2条语句来测试下

1 1.count(*) , a2中description存入了比较大的数据
2 select sql_no_cache count(*) from a1;  #平均0.12 sec
3 select sql_no_cache count(*) from a2;  #平均0.65 sec

  2.接下来给user_name加上普通索引

1 alter table a1 add index user_name (`user_name`);
2 alter table a2 add index user_name (`user_name`);

  执行以下语句来验证

1 select sql_no_cache count(*) from a1 where user_name>‘user0‘;
2 select sql_no_cache count(*) from a2 where user_name>‘user0‘;

  

  通过测试,对a1的count(*)变慢了,但是a2的count(*)快了几倍。

  以上都是自己猜想实验,也许中间是其他原因导致猜想测试不准确,欢迎高手指点。

  参考:http://www.t086.com/article/5083

时间: 2024-08-01 17:52:18

innodb count优化测试的相关文章

MySQL参数优化测试建议

一.参数优化前压力测试0.优化测试前提虚拟机vm12.5,OS centos 6.9(系统已优化),cpu2(I5 4288u 2.6GHZ),MEM4GB ,HardDisk:Apple SSD(SM-0512F) 1.模拟数据库数据为了测试我们创建一个test1的库创建一个tb1的表,然后导入20万行数据,脚本如下:vim slap.sh #!/bin/bash HOSTNAME="localhost" PORT="3306" USERNAME="ro

互联网场景下闪存优化测试和应用

原创 2016-07-11 杨尚刚 Docker 闪存在这几年存储领域发展非常快,应用也越来越广泛,如何能更好的使用闪存,本次分享讲一些闪存相关的优化和应用. 闪存应用场景 数据库 NoSQL 分布式存储 CDN 公有云存储 综合上面几种场景看,闪存主要适合有比较高的随机IO需求和带宽需求的场景.场景选择上,也是要发挥闪存的长处.目前上面业务中 未来几年发展比较快的会是在公有云存储这一部分.下图就是某厂商云盘对比,可以看到闪存的价格已经很接近机械硬盘了,而单从每IOPS成本看,性价比会更高. 闪

mysql innodb 性能优化

默认情况下,innodb的参数设置的非常小,在生产环境中远远不够用比如最重要的两个参数innodb_buffer_pool_size 默认是8Minnodb_flush_logs_at_trx_commit 默认设置的是1 也就是同步刷新log(可以这么理解) innodb_buffer_pool_size: 这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面InnoDB性能很差.在只有 InnoDB存储引擎的数据库服务器上面,可以设置6

Mysql Innodb 引擎优化

介绍: InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句 提供一个Oracle风格一致的非锁定读.这些特色增加了多用户部署和性能.没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常 小的空间.InnoDB也支持FOREIGN KEY强制.在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合. Innodb 的创始人:Hei

SEO性能优化测试-TDK

最近在做Sephora SEO性能优化测试,其中有关于网站TDK和Omniture的功能测试,之前没有接触过这部分内容,所以最近学习了解了下. 1. 什么是网站TDK? TDK是个缩写,seo页面中的页面描述与关键词设置. 其中"T"代表页头中的title元素,这里可能还要利用到分词技术,当标题(Title)写好后,我们就尽可能不要再去修改了,尽量简洁,没意义的词尽量不要加入到标题中,避免干扰到搜索引擎识别网站主题(标题在三十个以内). 其中"D"代表页头中的des

(转) mysql数据库引擎:MyISAM和InnoDB(性能优化)

转自 http://yuwensan126.iteye.com/blog/1138022 Mysql 数据库中,最常用的两种引擎是innordb和myisam.Innordb的功能要比myiasm强大很多,但是innordb的性能要比myisam差很多,如果你的网站只是做简单的查询,更新,删除,那么用myiasm是最好的选择. 所有的性能测试在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 内存的电脑上

Mali GPU OpenGL ES 应用性能优化--测试+定位+优化流程

1. 使用DS-5 Streamline定位瓶颈 DS-5 Streamline要求GPU驱动启用性能测试,在Mali GPU驱动中激活性能测试对性能影响微不足道. 1.1 DS-5 Streamline简介 可使用DS-5 Streamline从CPU和Mali GPU中实时收集性能计数器,然后以图形方式显示这些计数器,其主要功能如下:     ? 收集计数器--从CPU和Mali GPU中     ? 保存收集到的计数器数据以供回放     ? 查看显示GPU活动.GPU活动和Framebu

mysql innodb count(*)速度慢且不准确的解决办法

innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据.而innodb必须全表扫描一次方能得到总的数量.要初步解决这个问题,需要做不同于myisam的一些工作: 1.使用第二索引(一般不使用主键索引),并且添加where条件,如: 复制代码 代码如下: select count(*) from product where comp_id>=0 ; show index f

MySQL count 优化

从博客园开播后一直没有时间来更新,最近总是在忙一些项目的问题,终于告一段落,需要整理一下. 这个项目是从oracle迁移到mysql平台,一主三从,做读写分离.迁移后压力测试,发现系统经常卡死.慢SQL都是select count(*) 之类的. 单独执行select count(*) from tab ...在数据库中执行时间居然需要5s左右,这在oeacle数据库中是很快的. 查看执行计划发现SQL居然走全表扫描. 修改为select count(id) from tab ...后速度在秒内