Это происходит медленно при использовании столбца в mysql select в другом select

#mysql

#mysql

Вопрос:

в приведенном ниже коде я получаю запрос о том, сколько товаров есть в категориях в категории объявлений.

Однако, когда я использую следующие слова where, запрос занимает 40 секунд, если нет, он выдает результаты через 2 секунды.

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

LENGTH (cat_code) <LENGTH (product_categories.category_id)
  

Количество данных равно 40 000.

Мне нужно использовать этот запрос, потому что я могу выбрать категории в категории «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
  

Комментарии:

1. Что такое тип category_id данных? Похоже, что это число, но для его тестирования LIKE требуется преобразовать его в строку. Это предотвращает использование индекса, поэтому он должен выполнить полное сканирование.

2. Почему вы используете LIKE для сопоставления чисел?

3. Если вы хотите сопоставить все идентификаторы категорий, начинающиеся с 103 , вы должны использовать category_id BETWEEN 103000 and 103999 . При этом будет использоваться индекс.

4. Если ваши идентификаторы категорий структурированы, вероятно, было бы лучше разделить его на два столбца: один для кода, другой для дополнительного идентификатора.

5. Я пропустил тип данных category_id — varchar . Я преобразовал его в целое число, и оно увеличилось с 40 секунд до 18 секунд. но я думаю, мне нужно немного ускорить его, каков ваш совет?