gpt4 book ai didi

mysql - tinyint列优化mysql

转载 作者:行者123 更新时间:2023-11-29 04:46:15 25 4
gpt4 key购买 nike

我有一个包含列 id(INT,主键)、name(VARCHAR)、status(TINYINT) 的 posts 表。帖子的状态可以是 1、2、3 或 4。而且,比方说,我想选择状态为 2 的帖子。我如何优化表以进行快速查询,因为为状态字段添加索引不会有太大帮助。

我使用 mysql 5.5。引擎可以是 innodbmyisam

谢谢

评论更新

据我了解索引是如何工作的,当我们添加索引时,它有点创建该列的副本,但以有序的方式 - 数字(或文本 - 按字母顺序),所以它提供了二进制的可能性搜索。所以,如果我们需要找到一些值,我们可以避免对表进行全扫描。但在这种情况下,假设我的表中有 100K 行,并且大致说 - 状态为 1、2、3 和 4 的行数相等。如果我为该字段添加索引,毕竟它应该对其余 25k 行进行线性搜索,如果我们考虑到添加索引会减慢插入和更新速度,也许它不值得。

查询 - SELECT id, name FROM posts WHERE status = 2

最佳答案

索引在这种情况下的效果取决于几个因素。以下是索引可以正常工作的三种情况(第三种归功于 Vatev)。

第一种情况是状态 2 的记录非常少。假设您有一个包含一百万条记录的表,并且在任何给定时间只有 100 条记录处于状态 2。索引将帮助您找到它们。

第二种情况是 status 是表中的主键(或至少是主键中的第一列)。这将任何具有 status = 2 的表扫描限制为仅表的一部分。当然,在状态上使用主键会使后续更新状态的成本更高,因为必须根据状态值对数据进行物理重新定位。

第三种情况是 status —— 或者索引中包含 status 的列 —— 是覆盖索引。这意味着查询所需的所有列都在索引中,因此引擎永远不必查找原始数据页。

一般来说,我建议不要在低基数字段上建立索引。这是一般规则,但在某些情况下,这样的索引可以提高性能。

关于mysql - tinyint列优化mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18464932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com