У меня есть скрипт, который запускает ниже sql
. Производительность этого запроса не так уж плоха до сих пор, и я считаю, что это из-за большого количества записей, которые существуют в одной из таблиц, и, согласно объяснению, которое я выполняю в запросе, оно выполняет проверку против таблица всех пользователей (около 10 миллионов записей).Ошибка выполнения SQL-запроса Полное сканирование таблицы
Есть ли лучший способ написать это, чтобы он не сканировал, и я могу получить выполнение до < 1 секунда?
SELECT
`users` . *,
users.username AS `fullname`,
(SELECT
CONCAT_WS('|||',
image,
width,
height,
original,
mime)
FROM
`users_avatars`
WHERE
(user_id = users.user_id)
AND (size = '_A')
LIMIT 1) AS `user_avatar_a`,
(SELECT
CONCAT_WS('|||',
image,
width,
height,
original,
mime)
FROM
`users_avatars`
WHERE
(user_id = users.user_id)
AND (size = '_B')
LIMIT 1) AS `user_avatar_b`,
(SELECT
CONCAT_WS('|||',
image,
width,
height,
original,
mime)
FROM
`users_avatars`
WHERE
(user_id = users.user_id)
AND (size = '_C')
LIMIT 1) AS `user_avatar_c`,
((SELECT
COUNT(ufu_id)
FROM
`users_following_user`
WHERE
(user_id = 684767)
AND (following_id = users.user_id)
LIMIT 1) + (SELECT
COUNT(users_following_id)
FROM
`users_following`
WHERE
(user_id = 684767)
AND (following_id = users.user_id)
LIMIT 1)) AS `following_user`
FROM
`users`
WHERE
(users.user_id IN ((SELECT
`users_boards`.`user_id`
FROM
`users_boards`
WHERE
(board_id = '353048') AND (allow = 1))))
**** **** UPDATE Я считаю, что я изолирован, или по крайней мере сужен, где проблема происходит из.
SELECT *
FROM
`users`
WHERE
(users.user_id IN ((SELECT
`users_boards`.`user_id`
FROM
`users_boards`
WHERE
(board_id = '353048') AND (allow = 1))))
EXPLAIN на запрос дает следующее:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1, PRIMARY, users, ALL, PRIMARY, , , , 3952473, 100.00,
1, PRIMARY, users_boards, ref, user_id, user_id, 16, skoovy_prd.users.user_id,const, 1, 100.00, Using where; FirstMatch(users)
Какой стол большой мальчик –
Вы можете проверить EXPLAIN EXTENDED из каждого суб запроса, чтобы выяснить, какой из них является медленный запрос? Кроме того, попытались ли вы создать временную таблицу для вспомогательных запросов? – Jaylen
Есть ли веская причина использовать подзапросы вместо соединений? Сколько номеров идентификаторов пользователей находится в users_boards? –