在另一个select中使用mysql select中的列时速度较慢
在下面的代码中,我得到了关于广告类别下的类别中有多少产品的查询 但是,当我使用下面的where单词时,查询需要40秒,如果没有,它将在2秒钟内给出结果在另一个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下的类别 我认为当我使用
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秒。但我想我需要加快一点,你有什么建议?