Почему мой запрос MySQL не использует желаемый индекс и как я могу оптимизировать его время выполнения?MySql

Форум по Mysql
Ответить
Anonymous
 Почему мой запрос MySQL не использует желаемый индекс и как я могу оптимизировать его время выполнения?

Сообщение Anonymous »

Я работаю с двумя похожими запросами SQL в MySQL, но один из них требует значительно больше времени для выполнения. У меня есть два запроса:
Query 1:

Код: Выделить всё

SELECT
s.mobileNumber,
s.SenderId,
REPLACE(REPLACE(REPLACE(REPLACE(s.Message, '\\r', ''), '\\r\\n', ''), '\\n', ''), '\\t', ' ') AS Message,
s.AliasMessageId,
s.messageid,
CONVERT_TZ(s.SubmitDate, 'UTC', '+06:00') AS Submitdate,
IFNULL(CONVERT_TZ(i.DoneDate, 'UTC', '+06:00'), 'Dlr Pending') AS DoneDate,
IFNULL(i.Status, s.Status) AS Status,
s.SmsCost,
s.SellingPrice,
s.countryiso AS CountryISO,
s.mccmnc AS MCCMNC,
(CASE WHEN i.ErrorCode IS NULL THEN s.ErrorCode ELSE i.ErrorCode END) AS ErrorCode,
s.gatewayid
FROM
sentbox PARTITION (p20250209) s
LEFT JOIN
inbounddlr PARTITION (p20250209) i FORCE INDEX (MessageId)  -- Force using MessageId index
ON s.messageid = i.messageid
WHERE
s.accountid = 704
AND s.SubmitDate BETWEEN '2025-02-08 00:00:00' AND '2025-02-08 23:59:59'
LIMIT
0, 65000;
Этот запрос возвращает 14 306 записей за 5 минут .
analytics :

Код: Выделить всё

"id"   "select_type"   "table"   "type"   "possible_keys"   "key"   "key_len"   "ref"   "rows"   "Extra"
"1"    "SIMPLE"        "i"       "ALL"    "MessageId"        \N      \N        \N    "2"    "Using where; Using join buffer (flat, BNL join)"

Query 2:

Код: Выделить всё

SELECT
s.mobileNumber,
s.SenderId,
REPLACE(REPLACE(REPLACE(REPLACE(s.Message, '\\r', ''), '\\r\\n', ''), '\\n', ''), '\\t', ' ') AS Message,
s.AliasMessageId,
s.messageid,
CONVERT_TZ(s.SubmitDate, 'UTC', '+06:00') AS Submitdate,
IFNULL(CONVERT_TZ(i.DoneDate, 'UTC', '+06:00'), 'Dlr Pending') AS DoneDate,
IFNULL(i.Status, s.Status) AS Status,
s.SmsCost,
s.SellingPrice,
s.countryiso AS CountryISO,
s.mccmnc AS MCCMNC,
(CASE WHEN i.ErrorCode IS NULL THEN s.ErrorCode ELSE i.ErrorCode END) AS ErrorCode,
s.gatewayid
FROM
sentbox PARTITION (p20250210) s
LEFT JOIN
inbounddlr PARTITION (p20250210) i FORCE INDEX (MessageId)  -- Force using MessageId index
ON s.messageid = i.messageid
WHERE
s.accountid = 704
AND s.SubmitDate BETWEEN '2025-02-09 00:00:00' AND '2025-02-09 23:59:59'
LIMIT
0, 65000;
Этот запрос возвращает 15 004 записи за 4 секунды .
analytics :

Код: Выделить всё

"id"   "select_type"   "table"   "type"   "possible_keys"   "key"   "key_len"   "ref"   "rows"   "Extra"
"1"    "SIMPLE"        "i"       "ref"    "MessageId"        "MessageId"  "152"  "itextwebv2smpp.s.MessageId"   "1"   "Using where"
< /code>
[b] Проблема: < /strong>
Я заметил, что, хотя второй запрос работает хорошо (4 секунды), первый запрос занимает гораздо больше (5 минут), даже если Оба запроса похожи. После анализа производительности запроса я заметил, что первый запрос  не использует желаемый индекс [/b] (MessageId
), в то время как второй запрос -. Могу ли я оптимизировать запрос, чтобы сократить время выполнения? будет оценен! Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ze-its-exe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»