Есть ли способ оптимизировать мой запрос, используя MySQL - PullRequest
0 голосов
/ 05 февраля 2020

Я новичок, когда дело доходит до оптимизации запросов, и я впервые сталкиваюсь с этой проблемой.

Когда я делаю запрос, обычно это только для данных 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`

Примечания:

  1. Поле токена уведомления - Json, поэтому я должен извлечь его, чтобы получить идентификатор JSON для notifToken поле
  2. Если вы спросите, почему там есть числа, я использую его для цикла

РЕДАКТИРОВАТЬ 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"
  }
]

1 Ответ

0 голосов
/ 06 февраля 2020

Не скрывать данные внутри структур. (В данном случае JSON.)

Похоже, вам нужна таблица из 3 столбцов, содержащая до 100 строк для данных JSON. Столбцы будут иметь вид time, id и N.

. После перемещения данных из JSON в такую ​​таблицу перезапишите запрос. Тогда, если у вас все еще есть проблемы с производительностью, мы можем обсудить дальше.

...