что быстрее?

Vadimka

Новичок
что быстрее?

банер может быть:
1 - обычный, 2 - системный, 3 - сомнительный

сайт может разрешать показывать форматы банеров 1,2,3
можно создать поле enum 1,2,3, или можно создать три поля для каждого типа site.b1, site.b2, site.b3

что будет быстрее работать?

baner.format LIKE CONCAT('%',site.format,'%') // поле enum
FIND_IN_SET (baner.format ,site.format)

b_baner.format IN (site.b1, site.b2, site.b3) // три поля
 

Popoff

popoff.donetsk.ua
Хорошо бы узнать весь запрос: есть ли между этими двумя таблицами какие-либо другие связи в запросах. Если известен запрос (а запросы, очевидно, должны быть известны), используй explain для проверки того, используются ли индексы.

С точки зрения скорости, если приведенные тобой варианты - единственно возможные, если никаких других связей между этими двумя таблицами нет, и если сводить скорость к вопросу об использовании индексов, то в первых двух случаях mysql никогда не будет использовать индексы. В последнем случае (с оператором in) mysql может использовать индекс по полю b_baner.format.

зы не совсем понятно, зачем для работы с полем enum использовать like.
 

Vadimka

Новичок
ситуация такая, поле baner.format числовое и может содержать или 1 или 2 или 3

далее есть сайт на котором мы хотим показать данный банер,
есть 2 варианта для сравнения разрешенных форматов банеров для показа на этом сайте:
1 вариант
`fb` set('1','2','3') NOT NULL default '1',

2 вариант
`fb1` tinyint(1) NOT NULL default '1',
`fb2` tinyint(1) NOT NULL default '2',
`fb3` tinyint(1) NOT NULL default '3',

какой вариант применить лучше?
 

Popoff

popoff.donetsk.ua
1 вариант
`fb` set('1','2','3') NOT NULL default '1',

2 вариант
`fb1` tinyint(1) NOT NULL default '1',
`fb2` tinyint(1) NOT NULL default '2',
`fb3` tinyint(1) NOT NULL default '3',
какая-то каша %) а почему нельзя просто
fb tinyint not null;
и сравнивать
baner.format=site.format
?

-~{}~ 26.02.05 08:56:

а, тфу, понял, почему нельзя %)
тогда осталось выяснить, что же тебе нужно: просто определить возможность показа конкретного банера на конкретном сайте или все-таки сделать какую-то выборку?

-~{}~ 26.02.05 09:23:

[бред]
 

Sirius

PHP+MySQL=LOVE
`fb` set('1','2','3') NOT NULL default '1' - конечно же лучше!!!

Хранишь в строке таблицы 1 байт (set), вместо 3 (3 tinyint).

Кроме того подразумеваешь добавление новых типов баннеров в будущем (до 64). Хотя 64 значения в set это уже 4 байта :)

Поиск по сету быстрый, однако можешь использовать битовые операции и поле tinyint - (хотя set делает тоже самое :) ) :
`fb1` tinyint(1) NOT NULL default '',

1 - обычный
2 - системный
4 - сомнительный

Значения поля:
1 - обычный
2 - системный
3 - обычный и системный
4 - сомнительный
5 - обычный и сомнительный
6 - системный и сомнительный
7 - Всё!
 

Vadimka

Новичок
Автор оригинала: Popoff
какая-то каша %) а почему нельзя просто
fb tinyint not null;
и сравнивать
baner.format=site.format
?

-~{}~ 26.02.05 08:56:

а, тфу, понял, почему нельзя %)
тогда осталось выяснить, что же тебе нужно: просто определить возможность показа конкретного банера на конкретном сайте или все-таки сделать какую-то выборку?

-~{}~ 26.02.05 09:23:

[бред]
есть случайный банер, у него есть формат (или 1 или 2 или 3)
и есть сайт на котором показывается данный банер, на сайте может быть роазрешено к показу допустим только обычные банеры (1), обычные + системные (1,2) или обычные + системные + сомнительные (1,2,3)

какой же это бред :)

-~{}~ 26.02.05 14:41:

Автор оригинала: Sirius
`fb` set('1','2','3') NOT NULL default '1' - конечно же лучше!!!

Хранишь в строке таблицы 1 байт (set), вместо 3 (3 tinyint).

Кроме того подразумеваешь добавление новых типов баннеров в будущем (до 64). Хотя 64 значения в set это уже 4 байта :)

Поиск по сету быстрый, однако можешь использовать битовые операции и поле tinyint - (хотя set делает тоже самое :) ) :
`fb1` tinyint(1) NOT NULL default '',

1 - обычный
2 - системный
4 - сомнительный

Значения поля:
1 - обычный
2 - системный
3 - обычный и системный
4 - сомнительный
5 - обычный и сомнительный
6 - системный и сомнительный
7 - Всё!
вопрос стоял что быстрее работает, я так понимаю что разницы в быстродействии практически нет в этих вариантах..
 

Popoff

popoff.donetsk.ua
какой же это бред
это не это бред, это бред то, что раньше было написано вместо слова [бред] :D

есть случайный банер, у него есть формат (или 1 или 2 или 3) и есть сайт на котором показывается данный банер, на сайте может быть роазрешено к показу допустим только обычные банеры (1), обычные + системные (1,2) или обычные + системные + сомнительные (1,2,3)
это хорошо. итак, ты отдельно выбрал банер, отдельно выбрал сайт, проверил возможность показа выбранного банера на выбранном сайте, убедился, например, что показать его там нельзя, и.... ? что дальше?

просто ответ на твой вопрос зависит от конкретного запроса. нельзя сказать в общем случае, что быстрее. если у тебя есть сайт и нужно, например, выбрать все банеры, которые можно показать на этом сайте, то это одно. Это один вариант ответа; можно было бы посоветовать выполнять такую выборку двумя запросами; выгднее хранить set для сайта и использовать in для поиска банера. Если ты выбрал банер, и нужно выбрать теперь все сайты, на котором можно показать этот банер - ситуация совсем другая, с другим ответом на твой вопрос. Если у тебя и банер и сайт уже выбраны, то это третья ситуация, с третьим вариантом ответа на твой вопрос; в таком случае действительно по быстродействию - одинаково, хотя использование set выглядит более оправданно. Какая из этих ситуаций складывается у тебя, ты не говоришь. Непонятно так же, складывается ли у тебя одна из этих трех ситуаций, или, может, ты решаешь какой-то четвертый вариант задачи с приведенными тобой исходными данными. В таком случае ответ может оказаться не совпадающим с ни с одним из тех, которые можно было бы дать в первых трех случаях.
 

Vadimka

Новичок
у нас известен id сайта , затем выбираем банер который возможно показать на данном сайте, вот сам запрос:

$id_site=5;
SELECT bb.id, bb.id_site, bb.format_b2, bb.typ_b, bb.alt, bb.url_b, bb.profile, bs.procent
FROM bn_banners bb , bn_site bs , bn_site bs2
LEFT JOIN bn_profile bp ON bb.profile = bp.id
WHERE bs.balance2 > '0'
AND bb.id_site=bs.id
AND bs2.id='$id_site'
AND FIND_IN_SET(bb.format_b2,bs2.fb)
AND bs2.no_site2 NOT LIKE CONCAT('%',bb.id_site,'%')
AND (bp.id IS NULL || (bp.id IS NOT NULL && (FIND_IN_SET($id_site,bp.id_sites) && bp.onoff=1 && bp.format_seti='$format_seti')) )
ORDER BY RAND() LIMIT 1

-~{}~ 27.02.05 10:15:

AND FIND_IN_SET(bb.format_b2,bs2.fb)
bb.format_b2 - Это формат банера smallint(1)

а это варианты разрешенных к показу на этом сайте банеров:
1 вариант
`fb` set('1','2','3') NOT NULL default '1',

2 вариант
`fb1` tinyint(1) NOT NULL default '1',
`fb2` tinyint(1) NOT NULL default '2',
`fb3` tinyint(1) NOT NULL default '3',

приоритетным остается быстродействие, а не размер поля
 
Сверху