mySQL:制作3个字段的化合物索引,还是制作3个单独的索引?
-
11-10-2019 - |
题
我有一个MySQL表,除其他属性外,还具有时间戳,类型和一个user_id。
它们都是可搜索和/或可分配的。
为每个索引创建一个索引,还是使用所有三个或两者兼有一个单个化合物索引?
解决方案
Pablo的答案是正确的,但也许您未能意识到化合物索引可能是合理的。
您可以有多个索引,并且 idx1(tstamp, user_id)
不排除您 indx2(tstamp, type)
或者 idx1reverse(user_id, tstamp)
等等...
当复合索引涵盖查询中的所有条件时,它们最有用,因此您提出的索引最有用
SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type
如果您想提高此类查询的性能,则可以考虑添加复合索引。
索引的缺点是它减慢了所有更新操作。但是,大多数一般应用程序都进行了更多的选择,然后更新(无论是在交易中,即声明数量,尤其是在受影响/检索的记录方面),与此同时,对更新的更新更加容忍(用户主要判断了速度系统不是在需要更新记录的时候,而是在检索记录所需的时间;再次YMMV,并且有些应用程序不按照这样的规则播放)。
最好的是,如果您有某种方法可以根据典型的工作负载来测试数据库性能(创建一些典型的SQL脚本;独立且可重复,或在应用程序级别创建单元测试),然后您可以客观地调整数据库。
编辑还要意识到可以添加和删除索引,而无需在功能方面影响系统。因此,您可以稍后在系统的实际使用过程中调整索引 - 通常,您会收集和介绍慢速SQL查询,以寻找可以从添加索引中受益的条件。
其他提示
如果要分别在这些字段上执行搜索,则可能需要单独的索引来使查询运行速度更快。
如果您有这样的索引:
mysql> create index my_idx on my_table(tstamp, user_id, type);
您的查询是:
mysql> select * from my_table where type = 'A';
然后 my_idx
对您的查询不会有帮助,MySQL最终将进行完整的桌子扫描以解决它。
不隶属于 StackOverflow