素材牛VIP会员
MySQL SELECT COUNT(*) 花费6秒,如何优化
 go***le  分类:SQL代码  人气:813  回帖:8  发布于6年前 收藏

服务器阿里云ECS,centos, mariadb,数据表 info 现有13万条数据,然后执行了下面这一段:

sql#status是表info的一个索引字段
SELECT COUNT(*) FROM `info` WHERE `status`='1' #status=1为10万数据

执行花费 6987.0 ms 有时候会更长(尤其是第一次的时候)。如何优化?

阿里云ECS 1G读写性能

[root@aliyun basic]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
4096+0 records in
4096+0 records out
268435456 bytes (268 MB) copied, 23.0049 s, 11.7 MB/s

**对比linode 1024 1G***

[root@linode ~]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
4096+0 records in
4096+0 records out
268435456 bytes (268 MB) copied, 3.86091 s, 69.5 MB/s

后续 2015-6-30
我将内存增加到了2G之后,查询明显变快了!不超过1s!
关于一些回复说status加索引,肯定加了,不然怎么跑得动,直接504的好不
吐槽一下很多回复的本身就是错误的,我这两天找了很久,阿里云的磁盘IO性能确实是很低的。
阿里云后台管理,磁盘IO的平均是 0.015MB/s。使用fdisk -l 阿里云ECS是 512 byte,Linode 是 4094 byte。其实最根本问题还是IO问题,如果真的说将status另外独立表,这也是无济于事的,维护成本将增加。阿里云是普通磁盘,Linode 是SSD,确实是不具备可比性。

讨论这个帖子(8)垃圾回帖将一律封号处理……

Lv7 码师
封***榜 职业无 6年前#1

为什么要去解决不是你范围内的问题呢?只有阿里云是这样那就换呗。没必要在这些不成熟的云上浪费时间。他们总会变好的。但是如果你在它们身上浪费时间,是找不回的。

Lv6 码匠
飞***猪 交互设计师 6年前#2

这个时间太长了吧。等的人花儿都谢了。换服务器吧。阿里现在估计还不成熟。用百度试试。实在不行。选国外的吧。AWS。微软的AZURE都不错。我一直用AWS。木有楼主的问题。

Lv4 码徒
朱***叶 UI设计师 6年前#3

说到读写性能,楼主可以购买阿里云ssd硬盘或者直接使用RSD,当然,就算阿里云磁盘I/O为10M/S,也不能要6秒吧?何况你说的是写入性能,读取性能肯定不止10M/s

Lv4 码徒
大***咒 JAVA开发工程师 6年前#4

试试 count(1) status添加索引

同等阿里云>100W <500ms,IO并不是全部问题,才十几万数据233333333.

Lv6 码匠
zh***ni 职业无 6年前#5

阿里云的ECS确实IO性能很差,你直接用来假设数据库很容易出现这样的问题。

提供几条思路:

软件层面上
1. 检查你的库表,你这个数据量和查询速度完全不正常,应该是其他地方引发的问题导致的现象。
2. 可以尝试把status=1的数据单独移到一张表,直接统计总数就很快。

硬件层面上
1. 直接使用`RDS`,可以明显提高IO吞吐量,而且还有比较成熟的管理后台可以使用。
2. 购买`SSD`硬盘,但是这个性价比不高,除非还有其他较多的IO读写应用。
Lv1 新人
Sm***ty CEO 6年前#6

这个确实跟阿里云的硬盘IO有关,多年前我也曾用过阿里云的机器做服务器,运行一段时间后发现系统有异常,后来通过dd多次出来的结果只有大概 4 MB/s,这样的IO肯定不适合做数据库。不知道现在阿里云有没有ssd,如果有的话,建议选择ssd,否则只有花大力气优化了。

Lv6 码匠
su***an JAVA开发工程师 6年前#7

首先在做其他的优化之前,先应该优化下sql语句,在大数据量的查询语句中,一定要尽量的减少*号的使用,而使用明确的列名来告诉数据库你要查什么,否则数据库底层的查询会话更多的时间来理解你的*所代表的意思,这样当然会有一定的影响。

Lv6 码匠
雪***儿 职业无 6年前#8

阿里云使用机械硬盘,Linode使用固态硬盘,这样比合适吗?要不要考虑价格成本的因素。固态硬盘当然能提升数据库的性能,淘宝去IOE也引入了PCIe固态存储。

使用机械硬盘的时候,要尽量避免系统发生swap交换内存数据到磁盘。还有MySQL可以考虑关闭二进制日志,加大innodb_buffer_pool_size大小来提升性能,而且注意给WHERE子句中的条件字段status建立索引。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取