表使用的InnoDB,使用以下语句,数据有1400W,就统计个年龄段分别有多少人,索引age
select age,count(1) from user group by age使用show profile查看,发现sending data这种了7秒的时间
InnoDB_buffer_pool_size = 10G实在找不到优化了,难道已经到了mysql性能的瓶颈了?

解决方案 »

  1.   

    我之前看到这篇文章,可能能帮到你https://blog.csdn.net/yunhua_lee/article/details/8573621
      

  2.   

    这个主要是看执行计划有没有走age列上的索引,执行计划没问题,那么就是正常的。sending data是指SQL查询开始从表上面读取数据,到发送结果集到客户端的整个过程,所以如果查询本身需要访问大量数据,就决定了查询时间很长,那么sending data就自然占据了很多时间;所以你这个例子的sending data耗时过多,是因为SQL本身读取数据比较耗时;读取数据过多是因,sending data数值大是果。
      

  3.   

    这一篇我也看过了,但和他情况不太一样,我这里使用了索引,而且也走了索引,age本身的长度就很小int4,没啥长度
      

  4.   

    那也就是说到瓶颈了如果已经用上了索引,那应该就是瓶颈了,这个应该是覆盖索引了,只扫一个int列的索引,buffer pool应该够用。看看是否能把这个表拆分一下,MySQL1000W数据量一般差不多就会查询变慢了,当然也看平均行数据的长度,要是每行就几个整型,1个E估计也不是问题;可以尝试把跟sending data有关的一些内存配置加大一些,例如net_buffer;
    机械盘换成SSD等;
      

  5.   

    mysql的my.ini 中的 innodb_buffer_pool_size=8M这是mysql5.7默认的,改成512或1024,再重启即可.
    会让普通查询快一点。