MySQL SELECT COUNT(*) 花费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,确实是不具备可比性。

mysql 阿里云 mysql优化

fredmo 9 years, 10 months ago

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

有追求的美男子 answered 9 years, 10 months ago

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

coool answered 9 years, 10 months ago

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

提供几条思路:


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

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

无色D夜空 answered 9 years, 10 months ago

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

+and对钩? answered 9 years, 10 months ago

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

张是张柏芝的芝 answered 9 years, 10 months ago

试试 count(1) status添加索引

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

kleinxx answered 9 years, 10 months ago

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

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

hime. answered 9 years, 10 months ago

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

猫耳型菜姬互浊 answered 9 years, 10 months ago

Your Answer