SELECT COUNT(*) 查询如何优化?

2022-05-09 22:30:27 +08:00
 anxn

如题,业务上需要全文搜索,数据大约有两百万条,每次需要查询并统计条数,发现这样花的时间是两倍 ,第一条 SQL 花了两秒,COUNT 又花了两秒,这样效率太低了,请教如何优化?

因为项目原因,不让用 Redis ,是不是最好的方案就是再弄一张表单独记录 COUNT ,然后定期更新数据?

第一条 SQL

SELECT
	* 
FROM
	bookclist 
WHERE
	btitle LIKE '%社会主义%'

第二条 SQL

SELECT
	COUNT(*) 
FROM
	bookclist 
WHERE
	btitle LIKE '%社会主义%'

还有就是全文搜索准备用全文索引,然后用 MATCH AGAINST 查询,但是就是发现在查三个字的人名时速度还比不上 LIKE 查询,不知道各位 v 友知道怎么解决吗?

3569 次点击
所在节点    MySQL
26 条回复
sutra
2022-05-10 14:10:43 +08:00
@anxn 你是说 select count(*) from blockclist; (注意不带任何 where 语句)很快是吧?这个 mysql 优化过,相比 postgresql 。
anxn
2022-05-10 14:15:34 +08:00
@sutra 不是,是带上 WHERE MATCH ( btitle ) AGAINST 子句的,就是 MATCH ( btitle ) AGAINST 的记录数
mingl0280
2022-05-10 16:30:52 +08:00
第一个需求:不让你用 redis 你还不能自己写个缓存嘛……
第二个需求没搞过,不知道。
zmal
2022-05-10 16:54:32 +08:00
SQL 层面没什么好优化的。
1. 审视全文检索的需求到底是否必要,业务上是否可以规避,比如只允许查询预先缓存的 keyword 。
2. 用 mysql 的全文索引肯定没问题啊,你说的某个人名 5000 多条慢 90%是 IO 原因。
encro
2022-05-10 20:20:34 +08:00
没办法,记录集中确实慢。

ngram_token_size=1 试一下,中文简单的话都分字性能好像还会高一点

你 explain 的时候要看慢在哪里。
encro
2022-05-10 20:23:12 +08:00
理解 explain 每一列的意思,看没一列的输出,然后就知道有没有优化空间了。

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

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

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

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

© 2021 V2EX