Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL通过Id和超级字符串的组合进行选择_Mysql_Sql_Optimization_Indexing_Substring - Fatal编程技术网

MySQL通过Id和超级字符串的组合进行选择

MySQL通过Id和超级字符串的组合进行选择,mysql,sql,optimization,indexing,substring,Mysql,Sql,Optimization,Indexing,Substring,这与中的一个老问题有关,但这个问题不同 我有一个MySQL表格,里面有许多“客户”的web“文章”。该表名为ArticleTable,它有几个字段,其中两个是: CustomerId=拥有该商品的客户的Id。 ArticleId=文章url的子字符串,唯一标识文章url 现在,在运行时给定一个客户Id+一个网页的完整url,我需要查找表中是否有与此完整url匹配的客户文章。我能想到的一个明显的疑问是: SELECT * FROM ArticleTable WHERE CustomerId = g

这与中的一个老问题有关,但这个问题不同

我有一个MySQL表格,里面有许多“客户”的web“文章”。该表名为ArticleTable,它有几个字段,其中两个是:

CustomerId=拥有该商品的客户的Id。
ArticleId=文章url的子字符串,唯一标识文章url

现在,在运行时给定一个客户Id+一个网页的完整url,我需要查找表中是否有与此完整url匹配的客户文章。我能想到的一个明显的疑问是:

SELECT * FROM ArticleTable
WHERE CustomerId = givenCustomerId
AND 'givenCompleteUrl' LIKE CONCAT('%', ArticleId, '%')
现实情况是,我可能有很多客户,但每个客户只有几篇文章。然而,在上面的查询中,我不能完全控制MySQL的选择机制。因此,问题是:

  • 使用上面的查询语法,如果我正确定义了索引,MySQL是否足够聪明,可以只查看givenCustomerId的几行?(即,不决定先按ArticleId过滤,然后再按CustomerId过滤)

  • 或者,只需将所有给定的CustomerID行选择到PHP中,然后自己匹配字符串,会更快吗

  • 如果我仍然依赖MySQL来执行完整的查询,我应该定义哪些索引来优化上述查询


  • 我讨厌你的第二个where条款。它可能很慢,在某些情况下实际上是不正确的。最好在PHP中提取ArticleId,然后简单地执行以下操作:

    SELECT * FROM ArticleTable
    WHERE CustomerId = ?
    AND ArticleId = ?
    

    为了回答您的问题,我认为如果您使用此查询,索引
    (ArticleID,CustomerId)
    就足够了。

    MySQL应该足够明亮,可以使用索引按客户id进行搜索,然后检查url。