"сравнение" - объясните пожалуйста

Spear

почемучка
"сравнение" - объясните пожалуйста

Здравствуйте,
подскажите, пожалуйста, что означает параметр "сравнение" (в полях char, varchar и т.п.)?
НапримеР, мне нужно хранить в одном поле цифры, разделеные любым знаком, например точкой, запятой, двоеточием и т.п.
В данной таблице будет очень много записей (минимум 100к, максимум - около 300 тысяч) и таблица используется в запросах с объединением, то есть я очень хочу "облегчить" таблицу по максимуму и хочу узнать какое сравнение лучше всего использовать для такого поля и правильный ли тип поля я задаю (char)?

Буду благодарен за овтеты!
 

zerkms

TDD infected
Команда форума
хранить в одном поле перечисление значений не совсем корректно
заведи ещё одну таблицу - в ней и храни данные в int (или любом более подходящим для твоих данных)
 

Spear

почемучка
zerkms
я так и делал сначала но такой способ очень медленный.
получается у одного объекта минимум 4 поля, в которых будет в среднем по 5 значений через запятую.
итого 200к объектов * 5 = 1 000 000 записей в иаблице связи объект-значение. Выборка в таком случае 50 объектов (+ в зпросе, конечно, объединяются и другие таблицЫ) - от 3 секун до более 30. незнаю почему такая фигня получается.

поэтому буду лагодарен если все же подскажете какое сравнение лучше использовать.
 

zerkms

TDD infected
Команда форума
Spear
какие действия с этим самым полем в котором "цифры, разделеные любым знаком, например точкой, запятой, двоеточием" ты будешь производить?? будешь искать среди этих цифр какое то конкретное значение?
 

Spear

почемучка
zerkms
пока ещё точно не знаю. Сейчас на локалхосте тестирую предварительную структуру БД и пражаюсь:

Есть таблица объектов. Например это база фильмов. Нужно указать к каким жанрам относится фильм. По этим жанрам может производиться поиск.

Итак, решение было такое:
в основной таблице фильмов я сделал поле genres, в котором через запятую перечислялись номера жанров, например
1,4,21,23

+ в таблицу "mov2genre" со структурой movie_id | genre_id записывалась та же информация, но по одному жану на запись. то есть (для фильма с номером 1)
1 1
1 4
1 21
1 23

Объясню:
в первой таблице жанры перечислены чтобы при выводе списка фильмов не делать тяжеленный запрос в огроменную таблицу и не выбирать жанры, к которым относится фильм.

вторая таблица, то есть таблица связей,вообще была сделана уже для поиска, то есть найти фильмы жанра номер 6, скажем - простой запрос который выбирает номера всех фильмов у которых поле жанра=6.

НО при объеме в миллион записей в таблице связи жанр-фильм такой запрос (выбрать фильма в 6 жанре) выполняется очень долго, иногда - до 7 секунд. правда в этом жеапросе идет объединение с таблице названий фильмов (названия вынесены в отдельную таблицу).

Вообщем я незаю что делать. Индексы расставил правильно.

может быть для поиска фильмов в таком-то жанре не нужно делать, например, оди сложный запрос а просто вытащить сначала айди фильмов, а потом ипользуя эти айди сделать осталные запросы - узнать название, дату выхода в прокат (даты выхода тоже в отдельной таблицЕ, т.к. их может быть до 4-5).

-~{}~ 12.03.06 06:15:

что при этом странно - если делать поиск фильмов четвертой категории не по таблице связей "фильм-категория" а по тому самому полю, в основйно таблице вот так
select movie from movies where genre like ='%:4:%' то запрос выполняется за 0.00931 сек, при том что записей в тестовой таблице - 250к.
 

zerkms

TDD infected
Команда форума
жанры перечислены чтобы при выводе списка фильмов не делать тяжеленный запрос
этот запрос тяжёлый для тебя или для СУБД?

select movie from movies where genre like ='%:4:%'
этот запрос не использует индекс для поля `genre` (если таковой имеется)

так что я не верю что поиск по индексированной таблице занимает меньше, чем по не использующей индексы
 

Spear

почемучка
zerkms
этот запрос тяжёлый для тебя или для СУБД?
запрос, объединяющий в себе 4 таблицы, с группировкой и ордером по 1 (редко -по 2) полям.
При этом в основной таблице - 250к записей, в двух еще по 500, в стретьей меньше чем в первой в осовной на 30-40%.

+ имеем щй таблицу связей "фильм-жанр".
Для меня такой запрос сложности не составляет т.к. ничего сложного в его составлении нету, а вот БД задыхается.
 

Spear

почемучка
Я вот что ещё хотел спросить:
можно ли вообще использовать такой подход с поиском обхектов в данной катеоии используя не тдельную таблцу свяей "объект-значение" а просто where field LIKE '%:44:%'
?
дело в том что раньше я думал что запрос LIKE по таблице с 250 000 записей будет выполняться ОЧЕНЬ долго, но ведь теперь увидел - работает шустро.

Очень хочу узнать ваше мнение.
 

zerkms

TDD infected
Команда форума
Spear
запрос в виде LIKE '%any_string' по определению не использует индексы => происходит полное сканирование таблицы
 

Spear

почемучка
EXPLAIN - не смотерл. Сейчас поискал по мануалу но н там какото неудобный, и не написано примеров использования :( короче говоря не понял даже что это такое.

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

Andreika
1 минуту, сейчас напишу.

-~{}~ 12.03.06 06:50:

[sql]

select
a.movie_id as movie_id,
a.url as url_link,
a.score as score,

c.year as year,
c.day as day,
c.month as month,

b.title as title

from movies_main as a,
movies_titles as b

left join movies_dates as c on(a.movie_id=c.movie_id)
where a.movie_id=b.movie_id
and a.genre like '%:4:%'
group by(a.movie_id)
limit 0,200

[/sql]

пояснения краткие:
названия вынесены в отдельную таблицу т.к. для каждого объекта их может быть несколько, скажем 4. И каждое название сопровождается дополньительными данными, например, для фильмов, - регионом в котором испоьзуется это название (США, Россия например).

даты выхода фильмов в кинопроскат тоже вынесены в отделньую таблицу - по 1 записи на каждый регион (северная америка, европа, азия и конекретно - Россия).

так вот приведенный выше запрос выполняется за 0.01 сек максимум. Если лимт понизить до 0.50 то за 0.00931 .

НО если доабвить в запрос сортировку, например, по дате выхода фильма в покат то запрос вообще зависает.

[/sql]
 

zerkms

TDD infected
Команда форума
Spear
EXPLAIN SELECT ...

а теперь переделай запрос с 1:М, покажи его и скажи результаты

ps: ну и конечно же покажи на какие поля у тебя индексы
 

Spear

почемучка
я всеравно не понял, как этим пользоваться и что это вообще такое :(
а теперь переделай запрос с 1:М
что значит 1:М? что-то я торможу видимо.

Индексы на полях:
a.movie_id
b.movie_id
c.movie_id

также в основнйо таблице фильмов есть поле date. Несмотря на то, что даты выхода в прокат заносятся в отдельную таблицУ, в главной таблице все же пишется дата выхода тоже, для случаем когда нужно отсортировать выведенные результаты по дате релиза или просто в списках фильмов вывести дату релиза (чтобы е делать лишний апрос в таблицу релизов)

И вот когда по этому полю делаю ордер то запрос выполняется дольше 30 сек и я получаю ошибку что лимит на ожидаение исчерпан.
 

zerkms

TDD infected
Команда форума
Spear
1:М - это отношение "один к многим", т.е. тот вариант который я тебе сказал в самом начале...
сделай так, дополнительно добавь индекс на поле `genre` и на поля по которым производишь сортировку
 

Spear

почемучка
zerkms
ещё минут 10, я заново заполняю тестовую БД.
потом попробую отмечусть тут обязательно.

-~{}~ 12.03.06 07:26:

да, кстате, пока тут есть люди я хотел узнать - мне нужно каким-то образом записывать в БД информацию, что введенная дата является кварталом..
то есть, сейчас это я сделал так:

ввожу в бд в поле дата - "2006-03-20" и в другое поле, например "quater" и при обработке движок будет преобразовать это число в 1 квартал 2006 года.

Существуют другие варианты?
 

zerkms

TDD infected
Команда форума
Spear
внимательно прочитай в мануале раздел по оптимизации- потраченное на чтение время затем влихвую окупится
 

Spear

почемучка
zerkms
а на русском мануал есть? и там написано про кварталы (дата)?


пс
и все-таки если можно по сабжу - какое лучше использовать савнение для полей с данными через запятую\двоеточие?
 

zerkms

TDD infected
Команда форума
Spear
в поле дата типа (date) вводишь дату, в varchar вводишь quater, движок у тебя преобразует всё это в нужный формат...

мануала на русском (актуального) по mysql нет

и все-таки если можно по сабжу - какое лучше использовать савнение для полей с данными через запятую\двоеточие
сделай по человечески 1:М и у тебя всё будет отлично работать - я тебе это говорил уже как минимум 2 раза в этом треде
 

Andreika

"PHP for nubies" reader
>кварталы (дата)?
MEDIUMINT YYMMDD
61231 - 31 декабря 06
61200 - декабрь 06
62100 - 1 квартал 06 etc
 
Сверху