【问题标题】:What mysql indexes should I use with this query?我应该在这个查询中使用哪些 mysql 索引?
【发布时间】:2012-07-28 12:32:48
【问题描述】:
SELECT * FROM items WHERE caption LIKE 'name%' AND type = 'private' OR owner LIKE 'name%' type = 'private' ORDER BY uses DESC LIMIT 40;

可能的键:items_caption、items_owner、items_type 键:items_uses (通过解释命令得到这些)

执行该查询大约需要 1.8 秒,并且表中有超过百万条记录。我不知道如何为这个查询创建索引,而且我无法控制源,所以我无法修改查询。

【问题讨论】:

  • LIKE 'name%'type = 'private' 之间缺少的运算符是什么
  • 糟糕。这是与。 SELECT * FROM items WHERE caption LIKE 'name%' AND type = 'private' OR owner LIKE 'name%' AND type = 'private' ORDER BY 使用 DESC LIMIT 40;

标签: mysql linux indexing key


【解决方案1】:

您可以对“caption”进行全文索引,这会显着增加查询时间。

ALTER TABLE items ADD FULLTEXT(caption,owner);

Mysql v 5.6 及更高版本支持 innodb 中的全文搜索。 https://blogs.oracle.com/MySQL/entry/full_text_search_with_innodb

【讨论】:

  • 我正在使用innodb,所以我认为这是不可能的。我忘了说对不起。
  • 实际上在新版本的mysql中支持innodb数据库中的全文搜索。 blogs.oracle.com/MySQL/entry/full_text_search_with_innodb
  • 我也没有意识到,OP 不能修改查询,所以全文不会做任何事情。
【解决方案2】:

您需要先进行explain 查询,看看它是如何工作的。如果我们不知道查询是如何执行的以及您的表的结构,我们将无法帮助您。 IE,@chheplo 说您可以在文本搜索中添加索引

ALTER TABLE items ADD FULLTEXT(caption,owner);

但这将取决于您的数据库设计,如果您使用的是 Mysql 5.6- 并且您的引擎是 Innodb 它将无法工作,您需要 engine = MyISAM,才能创建文本索引,您还需要执行解释一下select是否也在使用它。但是我认为如果你避免“LIKE”它会更快,Performance of like '%Query%' vs full text search CONTAINS query

问候

【讨论】:

    【解决方案3】:

    既然你有选择 *,你不能真正做一个覆盖索引,但你可以在 (caption,type) 和 (owner, type) 上做一对复合索引。

    ALTER TABLE items ADD INDEX (caption, type);
    ALTER TABLE items ADD INDEX (owner, type);
    

    这应该会减少内部点查找。

    我认为您不需要全文搜索,因为您与 LIKE 比较的值不以通配符 (%) 开头。与不以 % 开头的字符串进行比较的点赞可以使用传统的快速 B 树索引。如果您在“%name”中的 LIKE 开头有一个 %,则情况并非如此。

    另外,不要忘记您的搜索条件:

    caption LIKE 'name%' AND type = 'private'

    owner LIKE 'name%' AND type = 'private'

    因此,如果标题子句失败并尝试按所有者和类型查找,“添加全文(标题,所有者)”将无济于事。

    【讨论】:

    • 谢谢。现在速度快了很多(耗时 0.031 秒)
    • 我现在注意到查询存在更多问题。当有像SELECT * FROM items WHERE caption LIKE '_name_%' AND type = 'private' OR owner LIKE '_name_%' and type = 'private' ORDER BY uses DESC LIMIT 40; 这样的查询时,它没有使用任何索引。只是因为名称在下划线之间。为什么会发生这种情况,有没有办法解决这个问题?
    • @user1563934 运行 show create table <tablename> 并将结果添加到帖子中,以便我可以看到您的表结构。除非您在下划线前面加上“%”,否则下划线不应影响任何内容。
    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多