Может ли кто-нибудь помочь мне с оптимизацией моего запроса, чтобы сократить время результата?

Имейте список API и используйте их случайным образом для каждого запроса. Например, в python

такие же клавиши = [key1, key1, key3 ....]

location = Geocoder(random.choice(keys)).geocode(address) 

или

location = Geocoder(random.choice(keys)).reverse_geocode(Lat,Long)

Исходя из ваших требований

0
задан O. Jones 18 January 2019 в 12:53
поделиться

1 ответ

Похоже, вы хотите показать 12 последних участников, которые соответствуют определенным критериям.

Несколько вещей.

  1. Ваш RIGHT JOIN в photos на самом деле является обычным внутренним JOIN: его столбцы появляются в вашем предложении WHERE.
  2. Возможно, вам нужны составные индексы в таблицах members и photos.
  3. SELECT many columns FROM ... JOIN ... ORDER BY column... LIMIT 12 является известным антипаттерном производительности: он создает сложный набор результатов, затем сортирует все, а затем отбрасывает почти все. Расточительное.
  4. У вас есть WHERE....members.banned != "1" фильтры неравенства, подобные этому, которые заставляют SQL работать тяжелее (== медленнее), чем равенства. Если вы можете изменить это на = "0" или что-то подобное, сделайте это.

(Я полагаю, ваш столбец lastdate находится в вашей таблице members, но вы не сказали нам этого в своем вопросе.)

Поэтому попробуйте что-то подобное, чтобы найти двенадцать Участники, которых вы хотите отобразить.

          SELECT members.mem_id
            FROM members
            JOIN photos ON members.mem_id=photos.mem_id
           WHERE photos.main=1 
             AND photos.approved=1
             AND members.banned!="1"
             AND members.profile_photo="1"
             AND members.profile_essentials="1"
             AND members.profile_user="1")
           ORDER BY lastdate DESC
           LIMIT 12

Это дает вам идентификаторы двенадцати членов, которые вы хотите. Используйте его в своем основном запросе.

    SELECT members.mem_id, members.username, members.online, 
           members.dob, members.regdate, members.sex, 
           members.mem_type, members.aboutme, 
           geo_cities.name AS city, 
           geo_countries.name AS country, photos.photo_path
      FROM members
      LEFT JOIN geo_cities    ON members.cty_id=geo_cities.cty_id
      LEFT JOIN geo_countries ON geo_cities.con_id=geo_countries.con_id
      JOIN photos ON members.mem_id=photos.mem_id
    WHERE members.mem_id IN (
          SELECT members.mem_id
            FROM members
            JOIN photos ON members.mem_id=photos.mem_id
           WHERE photos.main=1 
             AND photos.approved=1
             AND members.banned!="1"
             AND members.profile_photo="1"
             AND members.profile_essentials="1"
             AND members.profile_user="1")
           ORDER BY lastdate DESC
           LIMIT 12
         )
    ORDER BY lastdate DESC
    LIMIT 12

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

Затем создайте составной индекс по members(profile_photo, profile_essentials, profile_user, banned, lastdate). Этот составной индекс значительно ускорит ваше предложение WHERE.

Аналогично, создайте составной индекс на photos(mem_id, main, approved, photo_path).

Вещи всегда становятся захватывающими, когда базы данных начинают расти! Прочитайте онлайн-книгу Маркуса Винанда https://use-the-index-luke.com/

0
ответ дан O. Jones 18 January 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: