是否可以索引此mysql查询中的所有字段?

是否可以索引此mysql查询中的所有字段?,mysql,sql,performance,select,indexing,Mysql,Sql,Performance,Select,Indexing,我有这个mysql查询,我不确定索引查询中所有字段的含义是什么。我的意思是可以索引CASE语句、Join语句和Where语句中的所有字段吗?索引字段是否会影响性能 SELECT roots.id as root_id, root_words.*, CASE WHEN root_words.title LIKE '%text%' THEN 1 WHEN root_words.unsigned_title LIKE '%normalised_text%' THEN 2 WHEN unsigned_

我有这个mysql查询,我不确定索引查询中所有字段的含义是什么。我的意思是可以索引CASE语句、Join语句和Where语句中的所有字段吗?索引字段是否会影响性能

SELECT roots.id as root_id, root_words.*,
CASE 
WHEN root_words.title LIKE '%text%' THEN 1
WHEN root_words.unsigned_title LIKE '%normalised_text%' THEN 2
WHEN unsigned_source LIKE '%normalised_text%' THEN 3
WHEN roots.root LIKE '%text%' THEN 4
END as priorities
FROM  roots INNER JOIN root_words ON roots.id=root_words.root_id
WHERE (root_words.unsigned_title LIKE '%normalised_text%') OR (root_words.title LIKE '%text%')
OR (unsigned_source LIKE '%normalised_text."%') OR (roots.root LIKE '%text%') ORDER by priorities
另外,如何进一步提高上述查询的速度

谢谢

  • 可以为表中的列编制索引,而不是查询

  • 您指定的任何搜索条件都不能使用索引(因为搜索词以通配符开头)

  • 您应该确保对
    id
    列进行了索引,以加快
    加入
    。(据推测,它已经作为一个表中的主键和另一个表中的外键进行了索引)


  • 要加速此查询,您需要使用全文搜索。添加索引不会加快此特定查询的速度,并且会花费您在插入、更新和删除上的时间。

    警告:索引会加快检索时间,但会导致插入和更新运行较慢。

    要回答为每个字段编制索引的含义,无论何时通过插入、更新或删除修改索引的数据,使用索引都会影响性能。这是因为SQL需要维护索引。这是数据读取频率与修改频率之间的平衡

    在这个特定的查询中,唯一可能有用的索引是
    JOIN
    子句中的
    root.id
    root\u words.root\u id
    字段

    WHERE
    子句中的任何检查都无法索引,因为前面的
    “%”
    。这会导致SQL扫描这些表中的每一行以查找匹配的值


    如果您能够删除前导的
    “%”
    ,那么您将受益于这些字段上的索引。。。如果没有,你应该考虑实施;但请注意,这并不是一件小事。

    当与“%something%”之类的
    结合使用时,索引将毫无帮助

    这就像在字典中查找某个地方有
    ae
    的单词一样。词典(或本例中的索引)是根据单词的第一个字母,然后是第二个字母等进行组织的。它没有机制将所有带有
    ae
    的单词紧密地放在一起。你还是把整本字典从头到尾读完了


    为CASE子句中使用的字段编制索引可能对您没有帮助。索引有助于在表中轻松查找记录。CASE子句是关于处理您找到的记录,而不是一开始就找到它们


    乐观主义者还可能难以优化多个不相关的
    条件,例如您的条件。乐观主义者正试图缩小完成查询的工作量,但如果不相关的条件可以使记录成为可接受的,则很难做到这一点


    总之,您的查询将受益于
    根(root\u id)
    和/或
    根(id)
    上的索引,但其他方面的好处不多

    但是,如果要为其他字段编制索引,两个主要成本是:
    -由于要写入的附加索引而增加了写入时间(插入、更新或删除)
    -磁盘上占用的空间增加