Я новичок, когда дело доходит до оптимизации запросов, и я впервые сталкиваюсь с этой проблемой.
Когда я делаю запрос, обычно это только для данных 5000-10000, но я очень шокирован, когда узнаю, что мой запрос не может извлечь данные около 40000-60000 , так как в php мой администратор сказал мне, что запрос не удалось получить, потому что он занимает слишком много времени, чтобы получить данные, используя мой запрос, так может ли кто-нибудь помочь мне оптимизировать мой запрос здесь? Я совершенно сбит с толку, так как уже могу сократить время с , который знает секунды , поскольку он не смог извлечь, пока не получит около 14-16 секунд , так как я обнаружил, что REGEXP
предложение имеет худшее время запроса, чем предложение IN
и Equal
, но мне все еще интересно, можно ли оптимизировать мой запрос, поэтому он может быть ниже 14 секунд
это MySQL query:
SELECT
aList.`UserId`,
aList.`email`,
aList.`FullName`,
aList.`aTime`,
aList.`NotifToken`
FROM
(SELECT
aPerson.`UserId`,
aPerson.`email`,
aProf.`FullName`,
REPLACE(JSON_EXTRACT(aPerson.`NotifTokens`, CONCAT('$[', Numbers.N - 1, '].time')), '"', '') AS aTime,
REPLACE(JSON_EXTRACT(aPerson.`NotifTokens`, CONCAT('$[', Numbers.N - 1, '].id')), '"', '') AS NotifToken
FROM
(
SELECT @row := @row + 1 AS N FROM
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) T2,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) T1,
(SELECT @row:=0) T0
) Numbers -- Natural numbers from 1 to 100
INNER JOIN takoshu_login_v2.`persons` AS aPerson ON Numbers.N <= JSON_LENGTH(aPerson.`NotifTokens`)
LEFT JOIN takoshu_login_v2.`prof` AS aProf ON aProf.`UserId` = aPerson.`UserId`
LEFT JOIN takoshu_examreport_v1.`exam_test_participant` AS aTest ON aTest.`UserId` = aPerson.`UserId`
WHERE aPerson.`EmailConfirmation` = 1 AND (aTest.`EventId` NOT IN ("1", "2","3") OR aTest.`EventId` IS NULL) AND aProf.`Class` IN ("Biology", "Mathematics", "Chemistry") GROUP BY aPerson.`UserId`
ORDER BY aTime DESC) AS aList
GROUP BY aList.`UserId`
Примечания:
- Поле токена уведомления - Json, поэтому я должен извлечь его, чтобы получить идентификатор JSON для notifToken поле
- Если вы спросите, почему там есть числа, я использую его для цикла
РЕДАКТИРОВАТЬ 1
Это пример уведомление Json о том, что я должен получить
[
{
"time": "2019-11-25T10:17:03.609Z",
"id": "e9KsB96Pnk:APA91bEMOrIkrUDe6KaXXD6f92_bWHlVTvgff8FCCMK9If_4wDLmaFu0FS1y04ywiwZoKgYPADIldZucnDdpyg--BslzCrcnhy0VBEl49tpqZRej0ZCIIeFM0QCxNoWjDgJtP8D6sTtP"
},
{
"time": "2019-12-02T09:55:31.107Z",
"id": "d_HuGJWFpWw:APA91bE7KKPOZGXFqygMdJO4yXXLRzM_vpFdWvxMG-TQw0cIZ6TNpoPNqMqInOic8wV-Z1TgyaLOLgpxxj0MJMBMUDWXt3PsEd8uOsff2ULahgZQM_IZxcppKNKjA-b-pW6LO2p0u_xD"
}
]