#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 секунд. но я думаю, мне нужно немного ускорить его, каков ваш совет?