CREATE TABLE messages (
id BINARY(16) NOT NULL PRIMARY KEY,
chat_id VARCHAR(128) NOT NULL,
author_id VARCHAR(128) NOT NULL,
created_at BIGINT SIGNED NOT NULL,
content VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
UNIQUE INDEX chat_id_created_at(chat_id, created_at DESC)
);
CREATE TABLE chat_users (
user_id VARCHAR(128) NOT NULL,
chat_id VARCHAR(128) NOT NULL,
active TINYINT(1) NOT NULL,
created_at BIGINT signed NOT NULL,
PRIMARY KEY (user_id, chat_id),
INDEX chat_users_chat_id(chat_id)
);
и user_id Я хочу получать временные метки последних сообщений во всех чатах, к которым принадлежит пользователь.
С помощьюchat_id_created_at
и user_id code> индекс в сообщениях следующий запрос работает мгновенно:
explain format=json (
SELECT MAX(m.created_at) FROM messages m WHERE m.chat_id = 'xyz'
)
EXPLAIN OUTPUT:
{
"query_block": {
"select_id": 1,
"message": "Select tables optimized away"
}
}
но когда я использую тот же запрос в качестве подзапроса, кажется, что все строки для каждого Chat_id сканируются, чтобы получить максимальное значение. В некоторых чатах сотни тысяч сообщений, поэтому работа в них становится медленной.
Я также пробовал использовать ORDER BY m.created_at DESC LIMIT 1 вместо MAX(m.created_at), но происходит то же самое.Мне кажется, что я упускаю что-то очевидное.
Мне трудно понять поведение моих запросов. Учитывая следующие таблицы: [code]CREATE TABLE messages ( id BINARY(16) NOT NULL PRIMARY KEY, chat_id VARCHAR(128) NOT NULL, author_id VARCHAR(128) NOT NULL, created_at BIGINT SIGNED NOT NULL,
content VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
UNIQUE INDEX chat_id_created_at(chat_id, created_at DESC) );
CREATE TABLE chat_users ( user_id VARCHAR(128) NOT NULL, chat_id VARCHAR(128) NOT NULL, active TINYINT(1) NOT NULL, created_at BIGINT signed NOT NULL,
PRIMARY KEY (user_id, chat_id), INDEX chat_users_chat_id(chat_id) );
[/code] и user_id Я хочу получать временные метки последних сообщений во всех чатах, к которым принадлежит пользователь. С помощьюchat_id_created_at и user_id code> индекс в сообщениях следующий запрос работает мгновенно: [code]explain format=json ( SELECT MAX(m.created_at) FROM messages m WHERE m.chat_id = 'xyz' )
EXPLAIN OUTPUT: { "query_block": { "select_id": 1, "message": "Select tables optimized away" } } [/code] но когда я использую тот же запрос в качестве подзапроса, кажется, что все строки для каждого Chat_id сканируются, чтобы получить максимальное значение. В некоторых чатах сотни тысяч сообщений, поэтому работа в них становится медленной. [code]explain format=json ( SELECT cu.chat_id, (SELECT MAX(m.created_at) FROM messages m WHERE m.chat_id = cu.chat_id), cu.active FROM chat_users cu WHERE cu.user_id = '???' )