可以利用多个 'range' 列上的索引吗?
Can indexes on multiple 'range' columns be utilized?
我有这个索引:
alter table wx_cbmessage add index main_query (cbm_owner_id,cbm_status,cbm_date,cbm_notification_date);
而这个查询:
SELECT SQL_CALC_FOUND_ROWS ...
FROM `wx_cbmessage` `msg` FORCE INDEX (main_query)
LEFT JOIN wx_user `from` ON cbm_from_user_id=from.login
WHERE `cbm_owner_id`='username'
AND cbm_date <= 1431448013
AND (`cbm_notification_date`=0 OR cbm_notification_date <= 1431448013)
AND `cbm_status`=1
ORDER BY `cbm_date` DESC
LIMIT 25
将 cbm_notification_date
作为索引的一部分有什么意义吗?可以利用吗?
前两列只是完全匹配,但我不知道 MySQL 是否可以进行多范围搜索。
请使用 table 别名限定列名称。不知道什么栏目是什么table,只好猜猜怎么劝了。
两个范围 -- 不会被使用。
EXPLAIN 无法解释 -- 尝试 EXPLAIN FORMAT=JSON SELECT ...
。
我推荐这个(因为列都在同一个 table):
INDEX(cbm_owner_id, cbm_status, cbm_date)
它可以用于2个常量和一个范围。它可以用于 ORDER BY
。
优化器没有好的方法来选择使用哪一个。
(`cbm_notification_date`=0 OR cbm_notification_date <= 1431448013)
无法使用索引,因为 OR
和 'range' 的组合。 (x=1 OR x=3)
等同于 (x IN (1,3))
,它比一个范围要好,虽然不如一个常量。
我有这个索引:
alter table wx_cbmessage add index main_query (cbm_owner_id,cbm_status,cbm_date,cbm_notification_date);
而这个查询:
SELECT SQL_CALC_FOUND_ROWS ...
FROM `wx_cbmessage` `msg` FORCE INDEX (main_query)
LEFT JOIN wx_user `from` ON cbm_from_user_id=from.login
WHERE `cbm_owner_id`='username'
AND cbm_date <= 1431448013
AND (`cbm_notification_date`=0 OR cbm_notification_date <= 1431448013)
AND `cbm_status`=1
ORDER BY `cbm_date` DESC
LIMIT 25
将 cbm_notification_date
作为索引的一部分有什么意义吗?可以利用吗?
前两列只是完全匹配,但我不知道 MySQL 是否可以进行多范围搜索。
请使用 table 别名限定列名称。不知道什么栏目是什么table,只好猜猜怎么劝了。
两个范围 -- 不会被使用。
EXPLAIN 无法解释 -- 尝试 EXPLAIN FORMAT=JSON SELECT ...
。
我推荐这个(因为列都在同一个 table):
INDEX(cbm_owner_id, cbm_status, cbm_date)
它可以用于2个常量和一个范围。它可以用于 ORDER BY
。
优化器没有好的方法来选择使用哪一个。
(`cbm_notification_date`=0 OR cbm_notification_date <= 1431448013)
无法使用索引,因为 OR
和 'range' 的组合。 (x=1 OR x=3)
等同于 (x IN (1,3))
,它比一个范围要好,虽然不如一个常量。