我目前正在创建一个应用程序,其中最重要的部分是一个包含20列的表。该表将来包含3-5-7k记录。我必须将来自此特定表的一个WHERE子句中的多个列组合起来用于过滤目的(小于,等于等)。 列是varchars,整数,小数和日期。 所以我的问题是如果我说3k行,如果在WHERE子句中使用全部或超过10个条件,我的查询可能会慢一点,我该如何决定要索引哪些列。如何优化此类查询。我知道3-5-7k行对于MySQL来说都不算什么。问题是我在表中有20列。此外,如果重要的话,我将在服务器上使用PHP。
提前致谢。
答案 0 :(得分:0)
在识别出主键之后,这可能是一个比性能优化更好的逻辑猜测,您可以在表中添加其他索引。
您必须记住,mysql在给定的表引用中一次只能有效地使用一个索引。现在引擎确实有可能在内部合并各种索引,然后使用它们,但性能不是很好。 (见:http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge)
我建议你确定一组你要处理的查询(最终与其他表连接),然后,如果有太多过滤字段,则找出最有效的字段用于过滤/在记录中。 如何知道什么是最有效的?例如,非空的唯一字段几乎是一个很好的选择:mysql将像ligtning一样快速地过滤掉这个字段。
通常,经验法则是拾取高度差异的列/列集:值不应重复太多次,否则索引效率低。
这是一个开始。
问候
答案 1 :(得分:0)
每个表都有特定的行为。我们必须分析每个案例。
一般而言,要快速进行搜索,您应该在where中包含的20列中的每一列中创建索引。另一方面,这会减慢“插入”并占用很多空间索引。 因此,我们应该分析是否在每一列中添加索引。
决定哪个列不应该是此索引的一些提示: