问题描述
SELECT SUM(price) FROM mytable WHERE domain IN ('com') AND url LIKE '%/shop%' AND date BETWEEN '2001-01-01' AND '2007-01-01';
其中 domain
是 varchar(10),url
是 varchar(255),price
是浮点数。我了解任何带有 %..%
的查询都不会使用任何索引。从逻辑上讲,我在价格域和日期上创建了一个索引:
create index price_date on mytable(price,domain,date)
问题依旧,这个索引也没有使用,因为查询包含:url LIKE '%.com/shop%'
另一方面,FULLTEXT
索引仍然不起作用,因为我在查询中有其他非文本过滤器。
更新
这是sql限制吗?这样的查询能否在 nosql 数据库上提供更好的性能?
解决方法
您有两个范围条件,一个使用 IN()
,另一个使用 BETWEEN
。最大的希望是索引第一列的条件使用索引来检查行,而索引第二列的条件使用index condition pushdown让存储引擎做一些预过滤。
然后由您根据每个条件缩小搜索范围的程度来选择哪一列应该是索引中的第一列。如果 date
上的条件更有可能减少检查的行集,请将其放在索引定义中。
WHERE 子句中术语的顺序不必与索引中的列顺序匹配。
MySQL 不支持在同一个查询中对同一个表引用同时使用全文索引和 B 树索引进行优化。
无论如何您都不能为您正在搜索的模式使用全文索引。全文索引不允许搜索标点符号,只能搜索单词。
,我投票支持这个订单:
INDEX(domain,-- first because of "="
date,-- then range
url,price) -- "covering"
但是,由于常量看起来会命中 10 亿行中的大部分,因此我不希望有良好的性能。
如果这是一个常见的查询和/或“商店”是仅有的几个可能的过滤器之一,我们可以讨论汇总表是否有用。