mysql 如果我有两个查询,具有相同的字段,但不同的排序字段,那么,我应该创建一个单一的复合索引或多个复合索引

olmpazwi  于 2023-11-16  发布在  Mysql
关注(0)|答案(2)|浏览(182)

如果我有两个具有相同字段但不同排序字段的查询,那么我需要创建单个复合索引还是具有不同排序字段的多个复合索引?
我在一个电子商务网站上工作,我想根据用户的偏好按类别查询和排序(日期或价格)。我需要创建多少个单一和复合索引?
用户可能会进行以下查询

  • 按类别查询,按日期排序
  • 按类别查询,按价格排序
  • 无类别查询,按日期排序
  • 无类别查询,按价格排序

这里的类别是一个字符串数组。

选项1

post.index({
  category: 1,
  price: -1,
  cratedAt: -1,
});

字符串

选项二

post.index({
  category: 1,
  price: -1,
});

post.index({
  category: 1,
  createdAt: -1,
});

post.index({
  createdAt: -1,
});

post.index({
  price: -1,
});


哪种选择更好?
我正在使用MongoDB,但我也希望它能在其他数据库中完成。
我期待数以百万计的项目。所以,需要有最少的索引数量,因为RAM是有限的。

zlhcx6iw

zlhcx6iw1#

假设“query by category”意味着在一个提供的值上完全相等(不是模式匹配,不是IN-list或=ANY),那么在PostgreSQL中,每个查询需要4个索引才是最佳的:

(category, price)
(category, date)
(price)
(date)

字符串
如果你想用键设置分页,那么你需要在每一个的末尾包含一个打破平局的列,大概是“id”。

jgovgodb

jgovgodb2#

对于MySQL:

  • INDEX(Category, createdAt)用于按类别查询和按日期排序
  • INDEX(Category, price)用于按类别查询和按价格排序
  • INDEX(createdAt)用于无类别查询和按日期排序
  • INDEX(price)用于无类别查询和按价格排序

不要担心ASCDESC
也就是说,你需要4个不同的索引。(优化器很乐意从中挑选。)
“RAM有限”--这并不重要,因为索引块是缓存的。
查询是否包括LIMITWHERE中是否有其他项目?
请向我们展示SHOW CREATE TABLE,可能还有一些其他的改进,我可以建议。
(请将问题限制在单个DB引擎。

相关问题