【发布时间】:2013-06-02 22:29:23
【问题描述】:
我在 mysql 数据库中有一个名为 data 的表。该表非常大,大约有 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:我刚刚在其中一个字段上创建了一个索引,哇!查询正在立即执行。谢谢各位。
【问题讨论】:
-
是的 - 试试吧 - 你不会丢失任何数据。仅使用值 0 或 1 时可以使用 tinyint。
-
是所有字段的复杂单一索引还是每个字段的单独索引?据我了解,创建索引会导致表重新创建,我不想冒险。
-
餐桌娱乐?创建或删除索引不会影响任何数据或表本身。
-
要回答您的问题,我们需要 4 列中每一列的当前和目标基数。 (现在是不同的总行数/总行数,以及当表有 1M 条记录时您认为的估计值)。
-
您是否有检查所有 3(或 4)列的查询,例如:
where (country = X and state = Y and city = Z)?
标签: mysql performance indexing