我在mysql数据库中有一个名为data
的表。该表非常大,有大约500k记录,这个数字将增长到100万。每条记录包含大约50列,其中大多数包含varchars。
data
表经常被使用。实际上,大多数查询访问此表。大约50个用户同时读取和写入数据。系统负载很高,用户上传和检查数据,因此最多可以停止一两个小时。
经过一番研究。我发现几乎所有具有'where'子句的select查询都使用表中的四个字段之一。这些字段是:isActive,country,state,city - 都是int格式。哪里可以是
where isActive = {0|1}
或
where isActive = {0|1} and {country|state|city} = {someIntValue}
或
where {country|state|city} = {someIntValue}
最后一点是除了主要的id之外,表没有任何索引。
表格增长到当前尺寸后,我遇到了一些性能问题。
所以,我的问题是,如果我在列isActive,country,state和city上创建索引,性能会提高吗?
UPD:我刚刚在其中一个字段和WOW上创建了一个索引!查询正在立即执行。谢谢你们,伙计们。
答案 0 :(得分:2)
我认为索引isActive字段不是一个好主意,因为它会在添加/更新/删除时导致索引开销,但是在读取时它只会将数据拆分为两个块(1和0)它不会真的有用。
编辑:发现这个解释上面的要点: Is there any performance gain in indexing a boolean field?
对于其他树列,我建议您在大多数用户离线时(在夜晚或午餐时间)进行基准测试,看看它如何影响性能,但我认为如果没有很多缺点,它将真正有用。 / p>
编辑:ypercube已经发出了一些有趣的用例,其中我的索引布尔字段的答案不相关,请检查评论。
答案 1 :(得分:1)
是的,在这些列的每个上创建索引会对您有所帮助。
考虑并强调每个这个词。 我建议每个单独的索引。原因是列的不同组合共存。
答案 2 :(得分:1)
是的,肯定的。 如果您还为每个索引添加了选定的附加字段,您可能会看到更好的结果。只需仔细注意列顺序...... 但最重要的是,确保你不要使用myisam引擎进行大量写入的大桌面!例如,切换到innodb。