在我的 Mariadb 表中,我有两个 ID 列(A、B),它们组合起来是唯一的,但不是单独的。这张桌子很大。加快查询速度
SELECT B WHERE A=?
我添加了一个主键(A,B),效果很好。但是有时我也需要查询
SELECT A WHERE B=?
这是相当慢的。在这里提高性能的最佳方法是什么?在表上创建第二个唯一索引 (B,A) 是否合理?
此外,如果我确实创建了第二个索引,那么将条目插入表中是否会变慢,因为两个索引都被检查了?理论上,检查 (A,B) 是唯一的意味着 (B,A) 是唯一的,但是 Mariadb 知道这一点,还是检查两者?
是的,因为您
WHERE
在第二个查询的子句中的谓词在列上,并且您无法通过此查询查找以列(ie )B
开头的原始索引。因此,您目前可能遇到性能不佳的索引扫描。A
(A, B)
是的。
与其说是因为对唯一性的冗余检查,不如说是因为现在维护两个索引的额外写入开销。但通常这种开销可以忽略不计,除非您每秒写入数百万条记录,例如。
虽然在索引不足和索引过多之间存在总体平衡。这取决于查询用例、读取与写入工作负载、数据库服务器背后的基础设施以及可接受的运行时间。通常,一个表上最多 5 个索引就可以了,每个索引最多 5 列(为了识别索引宽度)也可以。但这是一个非常宽松的准则,有时更少或更多是特定表用例的正确数字。