【发布时间】:2019-07-10 22:48:59
【问题描述】:
我有 RatingTable:
UserID int,
Rating int,
BanMask int,
index rating_index (Rating DESC),
index ban_index (BanMask ASC)
假设此表中有超过 500 万行,并且只有大约 100 个真正被禁止的用户。
如果我对索引字段使用位数学运算,选择查询是否仍会被优化? 这 2 个查询会使用索引优化吗?
SELECT * FROM ProfileTable
WHERE BanMask > 0
ORDER BY Rating DESC LIMIT 10;
对
SELECT * FromProfileTable
WHERE (BanMask & (1 << 2)) > 0
ORDER BY Rating DESC LIMIT 10;
第二个问题。我应该在 Rating + BanMask 字段上添加索引以获得更好的优化吗?像这样:
CREATE INDEX rating_ban_index ON ProfileTable (Rating DESC, BanMask ASC)
【问题讨论】:
-
MySQL 可能不选择使用任何当前索引的潜在更大原因是:您正在使用
SELECT *。您实际需要哪些列? -
我真的需要 *,此配置文件表包含完整的配置文件描述:id、名称、游戏统计信息。在这种情况下,选定的列是否重要?我可以在第一遍只选择ID,然后选择数据的重置。
-
在 BanMask 字段中使用了多少位?该列中的最大值是多少?
标签: mysql optimization indexing