3

我有一个data在 mysql 数据库中调用的表。该表非常大,大约有 50 万条记录,这个数字将增长到 100 万条。每条记录由大约 50 列组成,其中大部分包含 varchars。

data表的使用非常频繁。实际上,大多数查询都访问该表。大约 50 个用户同时读取和写入数据。该系统负载很高,用户上传和检查他们的数据,因此最多可以停止一两个小时。

经过一番研究。我发现几乎所有具有“where”子句的选择查询都使用表中的四个字段之一。这些字段是:isActive、country、state、city - 都是 int 格式。where 可以是

    where isActive = {0|1}

或者

    where isActive = {0|1} and {country|state|city} = {someIntValue}

或者

    where {country|state|city} = {someIntValue}

最后一件事是该表除了主 id 之外没有任何索引。

在表增长到当前大小后,我遇到了一些性能问题。

所以,我的问题是,如果我在 isActive、国家、州和城市列上创建索引,性能会提高吗?

UPD:我刚刚在其中一个字段上创建了一个索引,哇!查询正在立即执行。谢谢你们。

4

3 回答 3

2

我认为索引 isActive 字段不是一个好主意,因为它会在添加/更新/删除时导致索引开销,但它只会在读取时将数据分成两块(1 和 0),所以它会没有真正的帮助。

编辑:发现这一点来解释上述观点: 索引布尔字段是否有任何性能提升?

对于其他树列,我建议您在大多数用户离线时(在晚上或午餐时间)进行基准测试,看看它如何影响性能,但我认为它确实会有所帮助,而且没有很多缺点。

编辑:ypercube已经发出了一些有趣的用例,其中我关于索引布尔字段的答案不相关,请查看评论。

于 2013-06-06T19:14:25.867 回答
1

是的,为这些列中的每一列创建索引将对您有所帮助。

考虑并在每个单词下划线。我建议每个索引都有一个单独的索引。原因是不同的列组合并存。

于 2013-06-06T19:11:59.330 回答
1

是的,一定。如果您也将选定的附加字段包含到每个索引中,您可能会看到更好的结果。请注意列顺序...但在此之前,请确保不要将 myisam 引擎用于具有许多写入的大表!例如切换到 innodb。

于 2013-06-06T19:23:56.230 回答