[英]MySQL: combining queries for speed
MySQL 超过 1000 万行的数据库。 我目前正在显示前十个结果,然后计算匹配总数。 前十个结果的内容在PHP中回显,然后显示总命中数。
第一条语句(快速):
SELECT * FROM `bigTable` WHERE `name` LIKE '%steve%' LIMIT 10
第二条语句(慢):
SELECT COUNT(1) FROM `bigTable` WHERE `name` LIKE '%steve%'
我想结合这些查询来提高速度。 我想保留用户在等待系统找到总数时看到前十个结果的功能。 这可能吗?
您的第二个查询需要检查每一行的名称列。 如果您在该条件下需要该号码,它将始终很慢。
您可能会考虑在 row(id) 中保留一个包含 word-occurs的单独表,(通过所有插入/更新/删除保持更新,可以使用触发器进行维护)。 您的搜索将始终使用 word='name' 连接到此表(要在此列上建立索引:word)。
您也可以按照其他人的建议使用 FULLTEXT 索引; 如果可用的话。
如果您要搜索“单词”,则使用FULLTEXT
索引和MATCH(name) AGAINST("+steve")
- 两个查询都会快得多。
另一方面,如果您必须搜索单词(等)的中间部分,那么使用LIKE
和前导通配符会尽可能快。 但是, COUNT
总是必须扫描整个表,而SELECT *
也会扫描到表的末尾,除非它在此之前找到 10 个。
根据您使用的版本,您可以使用SQL_CALC_FOUND_ROWS
和FOUND_ROWS
,但速度不会快很多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.