Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
在另一个select中使用mysql select中的列时速度较慢_Mysql - Fatal编程技术网

在另一个select中使用mysql select中的列时速度较慢

在另一个select中使用mysql select中的列时速度较慢,mysql,Mysql,在下面的代码中,我得到了关于广告类别下的类别中有多少产品的查询 但是,当我使用下面的where单词时,查询需要40秒,如果没有,它将在2秒钟内给出结果 product_categories.category_id LIKE CONCAT (cat_code, '%') LENGTH (cat_code) <LENGTH (product_categories.category_id) 数据数量为40000 我需要使用此查询,因为我可以选择我指定的类别103203下的类别 我认为当我使用

在下面的代码中,我得到了关于广告类别下的类别中有多少产品的查询

但是,当我使用下面的where单词时,查询需要40秒,如果没有,它将在2秒钟内给出结果

product_categories.category_id LIKE CONCAT (cat_code, '%')

LENGTH (cat_code) <LENGTH (product_categories.category_id)
数据数量为40000

我需要使用此查询,因为我可以选择我指定的类别103203下的类别

我认为当我使用cat_code列时会出现这种缓慢

  SELECT
    categories.CODE AS cat_code,
    categories.NAME,
    (
    SELECT
        COUNT( * ) 
    FROM
        ads
        JOIN products ON ads.product_id = products.id
        JOIN product_categories ON ads.product_id = product_categories.product_id
        JOIN b2b_users ON b2b_users.id = ads.uid
        JOIN categories ON product_categories.category_id = categories.CODE 
    WHERE
        b2b_users.ads_status = '1' 
        AND ads.STATUS = '1' 
        AND product_categories.category_id LIKE CONCAT( cat_code, '%' )
        AND product_categories.category_id != 103203 
        AND ads.stock > '0' 
        AND ads.banned = '0' 
    ) AS total,
    (
    SELECT
        COUNT( * ) 
    FROM
        ads
        JOIN products ON ads.product_id = products.id
        JOIN product_categories ON ads.product_id = product_categories.product_id
        JOIN b2b_users ON b2b_users.id = ads.uid
        JOIN categories ON product_categories.category_id = categories.CODE 
    WHERE
        b2b_users.ads_status = '1' 
        AND ads.STATUS = '1' 
        AND product_categories.category_id LIKE CONCAT( cat_code, '%' ) 
        AND product_categories.category_id != 103203 
        AND ads.stock > '0' 
        AND ads.banned = '0' 
        AND LENGTH( cat_code )< LENGTH( product_categories.category_id )
        LIMIT 1 
    ) AS subcattotal 
FROM
    categories 
WHERE
    catid = 103203 
ORDER BY
    categories.NAME ASC

类别id的数据类型是什么?它看起来像是一个数字,但使用like测试它需要将其转换为字符串。这会阻止使用索引,因此它必须执行完全扫描。为什么要使用LIKE来匹配数字?如果要匹配以103开头的所有类别id,则应使用103000和103999之间的类别_id。这将使用索引。如果您的类别ID是结构化的,那么最好将其分成两列:一列用于代码,另一列用于子ID。我忽略了类别ID的数据类型是varchar。我把它转换成整数,从40秒变为18秒。但我想我需要加快一点,你有什么建议?