Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день!
есть таблица с продуктами вот такого плана
Неактивен
Появилась еще одна проблема, ORDER BY cost работает еще медленнее чем COUNT()
SELECT
p.*,
m.name merchantName,
m.url merchantUrl,
m.delivery
FROM
product p
LEFT JOIN merchant m USING(merchantId)
WHERE
p.productId IN (
SELECT
productId
FROM
product
WHERE
MATCH (p.name,p.description) AGAINST ('+$keyword' IN BOOLEAN MODE)
)
AND m.status = 'ACTIVE'
ORDER BY p.cost
LIMIT 750
если проиндексировать этот столбец, это повлияет на производительность?
Отредактированно SaSa (16.02.2011 11:39:55)
Неактивен
Я бы побоялся делать такую большую табличку в MyISAM. Можно попробовать
использовать InnoDB + sphinx.
Теперь то, что касается производительности. Если делать COUNT(*), а не
COUNT(productId) — должно быть сильно быстрее, т.к. эту информацию можно
получить из полнотекстового индекса, а productId — нужно бежать за данными
в саму таблицу.
Что касается ORDER BY — тут Вам точно стоит пересмотреть архитектуру. MySQL
использует не более одного индекса, когда выбирает из таблицы. В Вашем слу-
чае Вы используете полнотекстовый. Он обладает приятной особенностью выби-
рать наиболее релевантные строки первыми, но если Вам нужна сортировка по
другому столбцу — будете сортировать в памяти.
Скорее всего, Вам вообще не нужен полнотекстовый индекс, а нужен набор клю-
чевых слов в отдельной табличке, и поиск по ним.
Неактивен
пока реализовал вот такой вариант, общая скорость выполнения увеличилась, но все равно очень медленно, до нескольких минут запросы выполняются некоторые..
делаем поиск и записываем результат во временную таблицу
Неактивен
InnoDB более устойчива ко всякого рода отказам, поэтому я ее люблю больше.
Если делать через временную табличку, возможно, в ней стоит добавить ключик
на user — сразу сможете искать нужные строки
Что касается оптимизации в целом — да, нужно придумывать какие-то сложные
методы, т.к. простые не работают: Вы используете полнотекстовые индексы не
так, как это делают все остальные.
Неактивен
Ну вот, изменил архитектуру, избавился от полнотекстовых индексов, теперь таблица с продуктами имеет вид
Неактивен
А зачем Вы пишете LEFT JOIN там, где ожидаете INNER JOIN? И почему
Вы объединяете по VARCHAR, а не по INT?
И EXPLAIN показывайте всё-таки
Неактивен
извиняюсь..
я поторопился.. еще немного переделал структуру..
вот основная табличка.. она в общем то почти не изменилась, добавилось поле parse
Отредактированно SaSa (16.03.2011 10:32:31)
Неактивен
А почему не написать обычный JOIN? Кажется, Вы гоняете данные лишний раз
туда-сюда. Ну и есть ощущение, что EXPLAIN не от этого запроса (нет using filesort).
От filesort избавиться нельзя, но влияние его можно уменьшить, если выбирать
id продуктов в нужном порядке, а потом уже все нужные поля. * нельзя выбирать
никогда.
Неактивен
Страниц: 1