微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL如何索引在列中搜索子字符串的查询同时过滤整数列

如何解决MySQL如何索引在列中搜索子字符串的查询同时过滤整数列

我有一个十亿多行的表格。我有以下经常执行的查询

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 亿行中的大部分,因此我不希望有良好的性能。

如果这是一个常见的查询和/或“商店”是仅有的几个可能的过滤器之一,我们可以讨论汇总表是否有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。