Сократите время для извлечения данных из базы данных MYSQL (записи в таблице 150 000) - PullRequest
0 голосов
/ 24 апреля 2020

Пожалуйста, помогите разобраться в этом, у меня есть база данных, в которой у меня есть 150 000 бизнес-записей, каждая бизнес-запись имеет свою собственную бизнес-категорию (например: бары, пабы, рестораны).

Я использую этот SQl для получения списка категорий в зависимости от местоположения посетителя.

SELECT 
ROUND(6371*acos(cos(radians('52.28231599999999'))*cos(radians(bizprof.vLatitude))*cos(radians(bizprof.vLongitude)-radians('-1.584927'))+sin(radians('52.28231599999999'))*sin(radians(bizprof.vLatitude))),2) AS distance,
`bizcat`.`vCategoryName`,
`bizcat`.`iCategoryId` FROM `business_profile` `bizprof`
LEFT JOIN `users` `u` ON u.iUserId = bizprof.iUserId
AND u.tiIsProfileSet = 1
AND u.tiIsActive = 1
AND u.tiIsDeleted = 0
LEFT JOIN `business_categories` `bizcat` ON bizcat.iCategoryId = bizprof.iCategoryId
GROUP BY `bizcat`.`iCategoryId`
HAVING distance >= 0 AND distance <= 10

Этот запрос занимает слишком много времени для визуализации данных из записей.

Есть идеи по этому поводу?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020
  1. Использование ST_Distance_Sphere (g1, g2 [, radius]) и пространственных индексов
  2. Переход на AND u.tiIsProfileSet = 1 AND u.tiIsActive = 1 AND u.tiIsDeleted = 0 в where условие.
  3. Избегать третьего объединения, извлекать данные из business_categories с помощью другого запроса (например, через отношение)

Попробуйте выполнить этот запрос

SELECT 
ST_Distance_Sphere(Point('-1.584927','52.28231599999999'), Point(`bizprof`.`vLongitude`,`bizprof`.`vLatitude`), 6370986 ) AS `distance`,
`bizprof`.`iCategoryId`
FROM `business_profile` `bizprof`
LEFT JOIN `users` `u` ON `u`.`iUserId` = `bizprof`.`iUserId`
WHERE 1=1
    AND `u`.`tiIsProfileSet` = 1
    AND `u`.`tiIsActive` = 1
    AND `u`.`tiIsDeleted` = 0
HAVING distance >= 0 AND distance <= 10*1000
0 голосов
/ 24 апреля 2020

просто несколько советов. Убедитесь, что у вас есть правильные составные индексы для

Столбцы business_profile таблицы (iUserId, iCategoryId)

столбцы пользователей таблицы (iUserId, tiIsProfileSet, tiIsActive, tiIsDeleted)

таблица столбца business_categories (iCategoryId)

, тогда вам не следует использовать group by без функции агрегирования (если вам нужен отчетливый результат, добавьте предложение DISTINCT в select)

вы также можете использовать where (повторяющийся код di для расстояния), а не наличие для фильтра результата

        SELECT 
        ROUND(6371*acos(cos(radians('52.28231599999999'))*cos(radians(bizprof.vLatitude))*cos(radians(bizprof.vLongitude)-radians('-1.584927'))+sin(radians('52.28231599999999'))*sin(radians(bizprof.vLatitude))),2) AS distance,
        `bizcat`.`vCategoryName`,
        `bizcat`.`iCategoryId` 
        FROM `business_profile` `bizprof`
        LEFT JOIN `users` `u` ON u.iUserId = bizprof.iUserId
            AND u.tiIsProfileSet = 1
                AND u.tiIsActive = 1
                    AND u.tiIsDeleted = 0
        LEFT JOIN `business_categories` `bizcat` ON bizcat.iCategoryId = bizprof.iCategoryId

        WHERE  ROUND(6371*acos(cos(radians('52.28231599999999'))*cos(radians(bizprof.vLatitude))*cos(radians(bizprof.vLongitude)-radians('-1.584927'))+sin(radians('52.28231599999999'))*sin(radians(bizprof.vLatitude))),2) >= 0 
        AND ROUND(6371*acos(cos(radians('52.28231599999999'))*cos(radians(bizprof.vLatitude))*cos(radians(bizprof.vLongitude)-radians('-1.584927'))+sin(radians('52.28231599999999'))*sin(radians(bizprof.vLatitude))),2) <= 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...