ОБНОВЛЕНИЕ (на основе ответов каждого):
Я думаю об изменении своей структуры, чтобы у меня была новая таблица с именем prx_tags_sportsitems. Я буду полностью удалять prx_lists. prx_tags_sportsitems будет действовать как ссылка на таблицу идентификаторов, заменяя prx_lists.ListString, которая использовалась для хранения идентификаторов тегов, принадлежащих каждому prx_sportsitem.
Новое отношение будет выглядеть так:
- prx_tags_sportsitems.TagID <-> prx_tags.ID
- prx_sportsitems.ID <-> prx_tags_sportsitems.OwnerID
prx_tags будет содержать TagName. Это так, что я все еще могу поддерживать каждый «тег» как отдельный уникальный объект.
Мой новый запрос для поиска всех спортивных элементов с тегом «аэробика» будет выглядеть примерно так:
SELECT prx_sportsitems.* FROM prx_sportsitems, prx_tags_sportsitems
WHERE prx_tags_sportsitems.OwnerID = prx_sportsitems.ID
AND prx_tags_sportsitems.TagID = (SELECT ID FROM prx_tags WHERE TagName = 'aerobic')
ORDER BY prx_sportsitems.DateAdded DESC LIMIT 0,30;
Или, возможно, я могу что-то сделать с предложением «IN», но я пока не уверен в этом.
Прежде чем я продолжу эту огромную модификацию моих сценариев, все одобряют? Комментарии? Большое спасибо!
ОРИГИНАЛЬНЫЙ ПОЧТА:
Что касается запросов MYSQL, я довольно новичок. Когда я изначально проектировал свою базу данных, я делал что-то довольно глупое, потому что это было единственное решение, которое я мог найти. Теперь я обнаружил, что это, кажется, вызывает слишком большую нагрузку на мой сервер MYSQL, поскольку для выполнения каждого из этих запросов требуется 0,2 секунды, и я считаю, что это может быть больше, чем 0,02 секунды, если это был лучший запрос (или дизайн таблицы, если он доходит до этого!). Я хочу избежать необходимости перестраивать всю структуру моего сайта, так как он глубоко спроектирован таким, какой он есть в настоящее время, поэтому я надеюсь, что возможен более быстрый запрос mysql.
В моей базе данных три таблицы:
- Таблица спортивных товаров
- Таблица тегов
- Таблица списков
Каждому спортивному предмету присвоено несколько имен тегов (категорий). Каждый «тег» сохраняется как отдельный результат в prx_tags. Я создаю «список» в prx_lists для спортивного элемента в prx_sportsitems и связываю их через prx_lists.OwnerID, который ссылается на prx_sportsitems.ID
Это мой текущий запрос (который находит все спортивные товары, имеющие тег 'aerobic'):
SELECT prx_sportsitems.*
FROM prx_sportsitems, prx_lists
WHERE prx_lists.ListString LIKE (CONCAT('%',(SELECT prx_tags.ID
FROM prx_tags
WHERE prx_tags.TagName = 'aerobic'
limit 0,1),'#%'))
AND prx_lists.ListType = 'Tags-SportsItems'
AND prx_lists.OwnerID = prx_sportsitems.ID
ORDER BY prx_sportsitems.DateAdded
DESC LIMIT 0,30
Чтобы пояснить больше, список, содержащий все идентификаторы тегов, находится внутри одного поля с именем ListString, и я структурирую его так: "# 1 # 2 # 3 # 4 # 5" ... и из этого, Приведенный выше запрос «concats» prx_tags.ID, тэг которого «aerobic».
Я думаю, что, вероятно, не существует более быстрого запроса, и что мне нужно просто принять, что мне нужно сделать что-то более простое, например, поместить все теги в список, прямо в prx_sportsitems в новом поле с именем " TagsList ", а затем я могу просто выполнить запрос, который выбирает Select * из prx_sportsitems, где TagsList LIKE"% aerobic% "- однако, я хочу избежать необходимости перепроектировать весь мой сайт. Я очень сожалею, что не смотрю на оптимизацию заранее: (