mysql 这个查询速度正常吗,怎么优化?

2023-10-29 11:10:03 +08:00
 cleveryun

买的数据库是阿里云的,配置信息:

目前有 4 千万不到的数据,我拆成了 8 个表,每个表放 500 万行数据。单张表的表结构如下:

create table `bio-hub`.`pubmed-article-0`
(
    pm_id             int           not null
        primary key,
    title             varchar(2000) not null,
    author            text          not null,
    lang              varchar(255)  null,
    abstract          text          null,
    keywords          text          null,
    journal_title     varchar(255)  null,
    journal_pub_year  varchar(255)  null,
    journal_pub_month varchar(255)  null,
    journal_i_s_s_n   varchar(255)  null,
    mesh_ids          varchar(2000) null,
    mesh_cat          varchar(2000) null comment '医学主题词所属分类,如`A01`',
    created_at        datetime      not null,
    updated_at        datetime      not null
);

create index `pubmed-article-0_journal_pub_year`
    on `bio-hub`.`pubmed-article-0` (journal_pub_year);

现状是我再 DataGrip 里光执行下面这样一句 count 都要三四十秒(首次,没缓存的情况下),是我哪里姿势不对吗,这也太慢了。带上关键词查询的 sql 不得更慢了。怎么破?

更新:我人在上海,数据库节点也是上海的。

SELECT COUNT(1) FROM `pubmed-article-1`;
6184 次点击
所在节点    MySQL
64 条回复
rimutuyuan
2023-10-29 11:12:02 +08:00
不正常,尝试用数据库同地域的服务器测试下
winglight2016
2023-10-29 11:19:51 +08:00
配置低了,我们这里 4000 多万条数据,也是 mysql ,机器配置高一些,count 一下也需要 17 秒左右。

count 是全表扫描,这个速度算是正常吧。

如果是查询 limit 1000 以内,可以 1 秒左右返回。
errZX
2023-10-29 12:01:01 +08:00
打个索引看看,不走索引的话估计比较难受
xoxo419
2023-10-29 12:16:21 +08:00
count 走的全表扫描,where 后的字段加索引后应该是很快的,如果需要频繁统计总数再建立一张统计表 用来专门保存统计的数据
ZZ74
2023-10-29 12:19:31 +08:00
count(journal_pub_year ) 试一试?
ZZ74
2023-10-29 12:20:52 +08:00
或者 count(pm_id) 试一试?
mayli
2023-10-29 12:47:40 +08:00
500 万行 = 5M 行, 你要是不需要 InnoDB 的特性,试试用 MyISAM 。
一般这种静态表可以不用 InnoDB ,如果必须要 InnoDB 看看增大 innodb_buffer_pool_size 。
mayli
2023-10-29 12:50:03 +08:00
我测试了一下,甚至 sqlite3 也没有这么慢

$ sqlite3 test.db
SQLite version 3.40.1 2022-12-28 14:03:47
Enter ".help" for usage hints.
sqlite> create table random_data as
with recursive tmp(x) as (
select random()
union all
select random() from tmp
limit 5000000
)
sqlite> select count(1) from random_data;
5000000

$ time sqlite3 test.db 'select count(1) from random_data;'
5000000

real 0m0.175s
user 0m0.124s
sys 0m0.051s
fredcc
2023-10-29 13:11:00 +08:00
mysql.n8m.medium.2c 是通用型,与其他用户共享 CPU 磁盘资源,不保证最大 iops
阿里云 RDS 自带基础硬件性能监控,查询性能监控和查询优化建议。
owen800q
2023-10-29 13:58:49 +08:00
差不多吧,建議換 mongo
bthulu
2023-10-29 14:13:08 +08:00
mysql 的全表 count 就是这么慢的, 你要么换 sql server 或者 oracle, 表 count 瞬间返回
akira
2023-10-29 15:21:41 +08:00
不正常, explain 看一眼呢
me1onsoda
2023-10-29 16:33:25 +08:00
说个题外话,这个配置合理吗?我 4 核 8g ,只能只吃 60%巍然不动,cpu 经常打满
Bingchunmoli
2023-10-29 17:09:53 +08:00
大概率是公网调用等延迟了
wellsc
2023-10-29 17:12:14 +08:00
别用 count ,找个外部存储存计数
Flourite
2023-10-29 17:12:39 +08:00
缺少数据库参数,innodb_buffer_pool_size 是多少
Itesting
2023-10-29 18:19:24 +08:00
你这全表扫描了,count 就这么慢,加配置 or 加 where 条件吧
ahopunk
2023-10-29 19:16:24 +08:00
同阿里云 mysql 实例,这个速度是正常的。
不过楼主 2 核 16G 内存的配置有点不理解,我 4 核 8G 的实例,跑起来内存和 cpu 占用比较和谐。
fd9xr
2023-10-29 19:20:03 +08:00
无语…才四千万你优化它干毛
Features
2023-10-29 20:25:44 +08:00
啊?还有人的 slow_launch_time 值大于 1 吗?
楼上说 count 就是这么慢认真的吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/986389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX