mysql - 如何使用 "select count(*)"和 "group by"加速 "where"?

标签 mysql performance indexing count group-by

如何使用group by加快select count(*)
太慢了,用的很频繁。
我在使用 select count(*)group by 与超过 3,000,000 行的表时遇到了很大的麻烦。

select object_title,count(*) as hot_num   
from  relations 
where relation_title='XXXX'   
group by object_title  

relation_titleobject_title 是 varchar。 where relation_title='XXXX',返回超过 1,000,000 行,导致 object_title 上的索引无法正常工作。

最佳答案

以下是我会尝试的几件事,按照难度递增的顺序:

(更简单) - 确保您拥有正确的覆盖索引

CREATE INDEX ix_temp ON relations (relation_title, object_title);

这应该在给定您现有模式的情况下最大化性能,因为(除非您的 mySQL 优化器版本真的很笨!)它将最小化满足您的查询所需的 I/O 数量(不像索引的顺序相反,其中必须扫描整个索引)并且它将覆盖查询,因此您不必触及聚集索引。

(有点难)- 确保您的 varchar 字段尽可能小

MySQL 上 varchar 索引的性能挑战之一是,在处理查询时,字段的完整声明大小将被拉入 RAM。因此,如果您有一个 varchar(256) 但仅使用 4 个字符,那么在处理查询时您仍然需要支付 256 字节的 RAM 使用费。哎哟!因此,如果您可以轻松缩小 varchar 限制,这应该会加快您的查询速度。

(更难)- 规范化

您的 30% 的行具有单个字符串值,这显然是为了规范化到另一个表中,这样您就不会重复字符串数百万次。考虑规范化为三个表并使用整数 ID 连接它们。

在某些情况下,您可以在幕后规范化并使用与当前表名称匹配的 View 隐藏规范化...然后您只需要让您的 INSERT/UPDATE/DELETE 查询知道规范化但可以离开单独你的选择。

(最难)- 散列字符串列并为散列编制索引

如果规范化意味着更改太多代码,但您可以稍微更改架构,您可能需要考虑为字符串列创建 128 位哈希(使用 MD5 function)。在这种情况下(与规范化不同)您不必更改所有查询,只需更改 INSERT 和一些 SELECT。无论如何,您需要散列字符串字段,然后在散列上创建索引,例如

CREATE INDEX ix_temp ON relations (relation_title_hash, object_title_hash);

请注意,您需要使用 SELECT 来确保您是通过哈希索引进行计算而不是拉入聚集索引(需要解析 object_title 的实际文本值以满足查询).

此外,如果 relation_title 具有较小的 varchar 大小但对象标题具有较长的大小,那么您可以仅散列 object_title 并在 (relation_title, object_title_hash) 上创建索引。

请注意,此解决方案仅在这些字段中的一个或两个字段相对于哈希值的大小而言非常长时才有用。

另请注意,散列对区分大小写/整理有有趣的影响,因为小写字符串的散列与大写字符串的散列不同。因此,您需要确保在对字符串进行哈希处理之前对字符串应用规范化——换句话说,如果您在不区分大小写的数据库中,则只对小写字母进行哈希处理。您可能还想从开头或结尾修剪空格,具体取决于您的数据库如何处理前导/尾随空格。

关于mysql - 如何使用 "select count(*)"和 "group by"加速 "where"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1031312/

相关文章:

java - 在 Java 中按值从 Map 中删除元素的最快方法是什么?

c - 指向结构或结构本身的指针?

indexing - Solr 提交和优化问题

c++ - 你能推荐一个全文搜索引擎吗?

mysql - 根据 3 个不同的列选择不同的行

mysql - 如何在Tomcat 7中使用Servlet和JSP在MySQL数据库中插入图像

javascript - $watch 与 ngChange

python - 如何添加到 python 中的奇数索引值?

php - 无法运行查询 : SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

PHP MySQL 检查字符串是否仅包含前几个字符的查询