当前位置: 首页 > 知识库问答 >
问题:

mysql - MYSQL 统计二十九万条数据要13.96秒正常吗?

王才英
2024-06-26
SELECT count(*) FROM `t_order_old`

二十九万条数据要13秒多,是不是有点久?这个语句也没办法优化了吧?

共有2个答案

况博容
2024-06-26

count(*)这种东西还是尽量别用,就算你折腾一下1秒内出了结果,但是加上条件、以后数据量更大的时候一样出问题。不如把需要的统计结果单独存一下,在更新时同步维护统计数据就行了。
懒得写代码的话就mysql里面直接挂触发器,比较省心(也避免业务逻辑复杂化)。
典型用例就是文章的回复数量字段,取这个值明显比每次都count强的多。

景安翔
2024-06-26

MySQL 统计二十九万条数据需要13.96秒确实不是一个理想的性能表现。但是否“正常”取决于多个因素,如硬件性能、数据库设计、索引结构、查询优化、当前的系统负载等。

对于SELECT count(*) FROM t_order_old这样的查询,以下是一些建议和优化措施:

  1. 确保表有适当的索引:虽然对于COUNT(*)操作,MySQL通常不使用索引(因为它需要计算所有行),但确保其他查询的索引是存在的并且维护良好的。
  2. 考虑使用近似值:如果你不需要精确计数,并且可以接受一些误差,那么可以使用SHOW TABLE STATUS来获取表的近似行数。
SHOW TABLE STATUS LIKE 't_order_old';

查看返回的Rows列。

  1. 检查硬件和配置:确保MySQL服务器有足够的RAM来缓存常用数据和索引。同时,检查磁盘I/O性能,因为这可能会成为瓶颈。
  2. 考虑使用缓存:如果这是一个频繁运行的查询,并且数据不经常更改,那么考虑在应用程序级别缓存结果。
  3. 优化数据库设计:确保表结构是合理的,并且没有不必要的数据冗余。
  4. 考虑使用更快的存储引擎:例如,InnoDB和MyISAM有不同的性能和特性。InnoDB通常提供更好的事务支持和行级锁定,但MyISAM在某些只读或大量读取的工作负载下可能更快。
  5. 查看查询执行计划:使用EXPLAIN关键字来查看MySQL如何执行你的查询,并找出可能的瓶颈。
EXPLAIN SELECT count(*) FROM t_order_old;
  1. 定期优化和清理:使用OPTIMIZE TABLE命令来重新组织表和索引,以及定期清理旧数据和不必要的数据。
  2. 升级MySQL版本:如果你使用的是较旧的MySQL版本,考虑升级到最新版本,因为新版本通常包含性能改进和修复。
  3. 考虑使用分布式数据库:如果数据量继续增长并且性能成为问题,那么可能需要考虑使用分布式数据库解决方案,如分片、分区或数据库集群。

最后,对于SELECT count(*) FROM t_order_old这样的查询,如果表中有很多行并且性能是一个问题,那么通常没有太多的优化空间,除了上述建议之外。但是,确保你已经尝试了所有的基本优化步骤,并且考虑了硬件和配置因素。

 类似资料:
  • 本文向大家介绍Mysql快速插入千万条数据的实战教程,包括了Mysql快速插入千万条数据的实战教程的使用技巧和注意事项,需要的朋友参考一下 一.创建数据库 二.创建表 1.创建 dept表 2.创建emp表 三.设置参数 SHOW VARIABLES LIKE 'log_bin_trust_function_creators'; 默认关闭.  需要设置为1。因为表中设置 mediumint 字段

  • 问题内容: 我正在为一个即将到来的Web应用程序进行数据库设计,我想知道是否有人在他们当前的Web应用程序中大量使用mysql,这种设计对于一个可以说80,000个用户的Web应用程序是否有效。 1个DB 在DB中,每个用户的功能都有数百万个表,并且在每个表中可能有数百万行。 尽管此设计非常动态并且可以很好地扩展,但我想知道两件事。 这是当今Web应用程序中的常见设计吗? 如果查询数百万行,这在时

  • 线程“main”java.lang.error:未解决的编译问题:类型不匹配:无法从java.sql.statement转换为com.mysql.jdbc.statement 我是java初学者,我正在尝试使用mysql数据库,我已经从mysql.com下载了mysql-connector-java-5.1.23-bin.jar文件,并且我已经将这个jar文件添加到我的项目的构建路径中,但是线程“

  • 您好,欢迎阅读 Matplotlib 教程中的 3D 绘图。 Matplotlib 已经内置了三维图形,所以我们不需要再下载任何东西。 首先,我们需要引入一些完整的模块: from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt 使用axes3d是因为它需要不同种类的轴域,以便在三维中实际绘制一些东西。 下面:

  • 主要内容:一、写在前面,二、问题源起,三、HDFS优雅的解决方案,(1)分段加锁机制 + 内存双缓冲机制,(2)多线程并发吞吐量的百倍优化,(3)缓冲数据批量刷磁盘 + 网络的优化,四、总结一、写在前面 上篇文章我们已经初步给大家解释了Hadoop HDFS的整体架构原理,相信大家都有了一定的认识和了解。 如果没看过上篇文章的同学可以看一下:《兄弟们给我10分钟,带你了解一下大数据技术的入门原理和架构设计!》这篇文章。 本文我们来看看,如果大量客户端对NameNode发起高并发(比如每秒上千次)

  • 29.2 按照字母顺序排列的 Perl 函数. 29.2.136 s/// s/// 替换操作符。参阅第五章里的“模式匹配操作符”。 29.2.137. scalar scalar EXPR 这个伪函数可以用于 LIST 里,当在列表环境中计算会生成一个不同的结果的时候,强迫 EXPR 在 标量环境中计算。比如: my ($nextvar) = scalar ; 避免 在做赋值之前从标准

  • 29.2 按照字母顺序排列的 Perl 函数 29.2.103. oct oct EXPR oct 这个函数把 EXPR 当作一个八进制字串并且返回相等的十进制值。如果 EXPR 碰巧以“0x”开头, 那么它就会被当作一个十六进制字串看待。如果 EXPR 以“0b”开头,那么它就解释成一个 二进制数的字串。下面的代码将把任何以标准的 C 或 C++ 符号写的十进制,二进制,八进制, 和十六进制输入

  • 29.2 按照字母顺序排列的 Perl 函数 29.2.30 each each HASH 这个以一次一个键字/数值对的方式遍历一个散列。如果在列表环境里调用它,each 返回一个两个 元素的列表,该列表包含散列中下一个元素的键字和数值,这样你就可以逐一遍历它们。如果在 标量环境里调用,each 只是返回散列中下一个元素的键字。如果散列已经全部读取完了,那么 返回一个空列表,如果你给这个空列表赋值