Разделить таблицу MySQL на 2?Текущий поиск слишком медленный - PullRequest
0 голосов
/ 09 февраля 2012

Я использую таблицу MySQL для хранения данных вещей на карте, которые будет искать пользователь.Сайт позволяет пользователю добавлять дополнительные фильтры, чтобы сузить его результаты.

Основной MySQL Query:

SELECT listing_id, listings.property_1, property_2, address_1, address_2, city, listings.lat, listings.lng, img_subpath, photos, some_timestamp
    FROM table
    WHERE listings.lat BETWEEN 61.123 AND 61.124
    AND listings.lng BETWEEN 40.123 AND 40.124
    AND some_timestamp BETWEEN DATE_SUB( NOW(), INTERVAL 0 DAY) AND DATE_SUB( NOW(), INTERVAL 5 DAY)')
    JOIN (SELECT price, lat, lng, MAX(some_timestamp) as latest FROM listings GROUP BY price, lat, lng) as t2', 'listings.price=t2.price AND listings.lat=t2.lat AND listings.lng=t2.lng AND listings.some_timestamp=t2.latest', 'inner')
    LIMIT 200,0

Столбцы:

(индексированные столбцы выделены жирным шрифтом)

(столбцы, начинающиеся с property_, являются дополнительными фильтрами, кроме первых 2)

  • list_id int (8)
  • url varchar (255)
  • city varchar (32)
  • somename varchar (32)
  • цена int (7)
  • price_per int (7)
  • property_1 int (2)
  • property_2 int (2)
  • address_1 varchar (255)
  • address_2 carchar (255)
  • city varchar (64)
  • statevarchar (32)
  • mail int (6)
  • some_timestamp timestamp
  • another_timestamp timestamp
  • lat float (10)
  • lng float (10)
  • текст описания
  • img_subpath varchar (15)
  • photos text
  • reply_email varchar (255)
  • phone varchar (16)
  • property_3 tinyint (1)
  • property_4 tinyint (1)
  • property_5 tinyint (1)
  • property_6 tinyint (1)
  • property_7 tinyint (1)
  • property_8 tinyint (1)
  • property_9 tinyint (1))
  • property_10 tinyint (1)
  • property_11 tinyint (1)
  • property_12 tinyint (1)
  • property_13 tinyint (1)
  • property_14 tinyint (1)

Проблема: База данных занимает слишком много времени (3-4 секунды) для получения результатов.Как можно увеличить скорость до <0,5 с, что было сделано на очень похожих сайтах? </p>

Если у меня есть 2 таблицы, первая таблица будет содержать только столбцы, участвующие в поиске, а следующая таблица содержит вседругие столбцы.Поэтому, когда происходит поиск, он ищет первую таблицу, получает listing_id результатов, а затем использует предложение IN для извлечения всех других данных из второй таблицы?

Пожалуйста, сообщите, спасибо!

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Я думаю, что вы пытаетесь получить метки времени последних пяти дней с помощью этого:

AND some_timestamp BETWEEN DATE_SUB( NOW(), INTERVAL 0 DAY)
AND DATE_SUB( NOW(), INTERVAL 5 DAY)')

Если это так, то оно должно совпадать с

AND some_timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 5 DAY)) AND NOW()

И если у вас нет записей с some_timestamp с будущим значением, которое вы можете использовать

AND some_timestamp > DATE_SUB(NOW(), INTERVAL 5 DAY))

Теперь, я думаю, это должно работать быстрее

SELECT listing_id, listings.property_1, property_2, address_1, address_2, city,
    listings.lat, listings.lng, img_subpath, photos, some_timestamp
FROM t2
LEFT JOIN listings
    ON (listings.price=t2.price AND listings.lat=t2.lat AND listings.lng=t2.lng
        AND t2.some_timestamp < listings.some_timestamp)
WHERE listings.lat BETWEEN 61.123 AND 61.124
    AND listings.lng BETWEEN 40.123 AND 40.124
    AND some_timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 5 DAY)) AND NOW()
    AND t2.some_timestamp is null
LIMIT 200

PS: я неНе думаю, что разделение таблицы значительно повысит производительность ... на самом деле, если вам нужно объединить обе таблицы, чтобы получить результат, потребуется больше

0 голосов
/ 09 февраля 2012

То, что вы предлагаете, это теория теории работы индексов.Скорее всего, замедление происходит из-за присоединения к агрегированному подразделу.Я бы посоветовал предварительно агрегировать эту информацию (не вижу ничего лишнего по какой-либо причине, почему вы не можете) и объединить эту таблицу.

...