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

248 天前
 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`;
5873 次点击
所在节点    MySQL
64 条回复
rimutuyuan
248 天前
不正常,尝试用数据库同地域的服务器测试下
winglight2016
248 天前
配置低了,我们这里 4000 多万条数据,也是 mysql ,机器配置高一些,count 一下也需要 17 秒左右。

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

如果是查询 limit 1000 以内,可以 1 秒左右返回。
errZX
248 天前
打个索引看看,不走索引的话估计比较难受
xoxo419
248 天前
count 走的全表扫描,where 后的字段加索引后应该是很快的,如果需要频繁统计总数再建立一张统计表 用来专门保存统计的数据
ZZ74
248 天前
count(journal_pub_year ) 试一试?
ZZ74
248 天前
或者 count(pm_id) 试一试?
mayli
248 天前
500 万行 = 5M 行, 你要是不需要 InnoDB 的特性,试试用 MyISAM 。
一般这种静态表可以不用 InnoDB ,如果必须要 InnoDB 看看增大 innodb_buffer_pool_size 。
mayli
248 天前
我测试了一下,甚至 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
248 天前
mysql.n8m.medium.2c 是通用型,与其他用户共享 CPU 磁盘资源,不保证最大 iops
阿里云 RDS 自带基础硬件性能监控,查询性能监控和查询优化建议。
owen800q
248 天前
差不多吧,建議換 mongo
bthulu
248 天前
mysql 的全表 count 就是这么慢的, 你要么换 sql server 或者 oracle, 表 count 瞬间返回
akira
248 天前
不正常, explain 看一眼呢
me1onsoda
248 天前
说个题外话,这个配置合理吗?我 4 核 8g ,只能只吃 60%巍然不动,cpu 经常打满
Bingchunmoli
248 天前
大概率是公网调用等延迟了
wellsc
248 天前
别用 count ,找个外部存储存计数
Flourite
248 天前
缺少数据库参数,innodb_buffer_pool_size 是多少
Itesting
248 天前
你这全表扫描了,count 就这么慢,加配置 or 加 where 条件吧
ahopunk
248 天前
同阿里云 mysql 实例,这个速度是正常的。
不过楼主 2 核 16G 内存的配置有点不理解,我 4 核 8G 的实例,跑起来内存和 cpu 占用比较和谐。
fd9xr
248 天前
无语…才四千万你优化它干毛
Features
248 天前
啊?还有人的 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