powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Имеет ли смысл индекс на boolean?
48 сообщений из 48, показаны все 2 страниц
Имеет ли смысл индекс на boolean?
    #35256102
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос профессионалам: имеет ли практический смысл индекс на boolean или tinyint (c 2мя - 4мя значениями)? Я нутром чую, что расходов на индекс будет много, эффективность низкая. Ситуация такая, есть 5000 тысяч товаров, есть 5 товаров дня. Не хочу создавать для них отдельную таблицу, добавляю флажок с индексом, но спасёт ли?
---------------------------------------
Не шалю, никого не трогаю, починяю примус (С)
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256199
Не имеет
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет смысла, т.к. избирательность такого индекса никакая
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256212
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не имеетНет смысла, т.к. избирательность такого индекса никакая
и какое решение мне подойдёт лучше? с доп.таблицей?
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256310
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey FurmanovВопрос профессионалам: имеет ли практический смысл индекс на boolean или tinyint (c 2мя - 4мя значениями)?
b-tree индекс в этом случае бессмысленен. Можно рассмотреть bitmap индекс, хотя если такое поле одно, и он скорее всего малоинтересен. Если ситуация такова, что очень много запросов отсекает именно по этому критерию, наилучшим выходом будет партиционирование по этому полю.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256359
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Furmanovс доп.таблицей?
В Вашем случае именно это решение будет наилучшим, то есть, просто отдельная таблица со ссылками на товары, а где надо только товары дня тащить - inner join.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256362
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовВ Вашем случае именно это решение будет наилучшим, то есть, просто отдельная таблица со ссылками на товары, а где надо только товары дня тащить - inner join.
Сереж, Вы серьезно так думаете? Чем же это решение будет наилучшим? Это просто неэффективная сама по себе имитация того самого индекса, который не будет использоваться из-за плохой селективности.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256371
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerСереж, Вы серьезно так думаете? Чем же это решение будет наилучшим?
Уверен, практика подтверждает это.
Это работает следующим образом. Сервер выполняет скан таблицы со ссылками (она маленькая и вся в памяти). Потом линкуется с большой.

softwarerЭто просто неэффективная сама по себе имитация того самого индекса, который не будет использоваться из-за плохой селективности.
Это нормальное решение для случая, когда решение через индекс не работает, а вовсе не "неэффективная сама по себе имитация того самого индекса".
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256392
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerb-tree индекс в этом случае бессмысленен. Можно рассмотреть bitmap индекс, хотя если такое поле одно, и он скорее всего малоинтересен. Если ситуация такова, что очень много запросов отсекает именно по этому критерию, наилучшим выходом будет партиционирование по этому полю.
Спасибо, сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table T_PRODUCT
(
   id int unsigned not null,
   price decimal( 12 , 4 ),
...
   primary key (id)
);
create table T_PRODUCT_OF_DAY
(
   id int unsigned not null,
   primary key (id)
);
alter table T_PRODUCT_OF_DAY add constraint FK_POD foreign key (id)
      references T_PRODUCT (id) on delete cascade on update cascade;
надеюсь, я понял правильно
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256394
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовУверен, практика подтверждает это.
Хотел бы на это посмотреть.

Сергей ВаскецовЭто работает следующим образом. Сервер выполняет скан таблицы со ссылками (она маленькая и вся в памяти). Потом линкуется с большой.
И что из этого? Тормоза идут как раз на "линкуется с большой". Индекс тоже небольшой и тоже может быть весь в памяти.

Сергей ВаскецовЭто нормальное решение для случая, когда решение через индекс не работает,
Почему же оно не работает?

Сергей Васкецова вовсе не "неэффективная сама по себе имитация того самого индекса".
Хм. Давайте так. На текущий момент - я уверен, что в описанной ситуации если заставить работать через индекс (например, хинтом) это будет эффективнее, нежели работать описанным образом. Сейчас подготовлю пример.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256407
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey FurmanovСпасибо, сделал так:

надеюсь, я понял правильно
К тому, что говорил я, это отношения не имеет. Это решение, о котором говорит Сергей, и которое по моему разумению будет менее эффективно чем индекс и чем просто доступ к основной таблице.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256418
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey FurmanovСитуация такая, есть 5000 тысяч товаров, есть 5 товаров дня.
Cтоп! Упустил из вида, что у вас перекошенная статистика. В этом случае индекс - самое оно, хотя надо посмотреть, как в вашем сервере построить его так, чтобы он правильно использовался.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256438
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerК тому, что говорил я, это отношения не имеет. Это решение, о котором говорит Сергей, и которое по моему разумению будет менее эффективно чем индекс и чем просто доступ к основной таблице. прошу прощения, а что есть "партиционирование" и где можно прочитать об этом? я посчитать что это и есть партиционирование...
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256449
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Alexey FurmanovСитуация такая, есть 5000 тысяч товаров, есть 5 товаров дня.
Cтоп! Упустил из вида, что у вас перекошенная статистика. В этом случае индекс - самое оно, хотя надо посмотреть, как в вашем сервере построить его так, чтобы он правильно использовался. MySQL 5.0.45
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256452
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНа текущий момент - я уверен, что в описанной ситуации если заставить работать через индекс (например, хинтом) это будет эффективнее, нежели работать описанным образом. Сейчас подготовлю пример.
Допускаю, что на ORACLE это так и будет. Я бы на месте автора озаботился спецификой конкретного его сервера (например, имеет ли сервер право игнорировать хинт), набросав врукопашную пару примеров.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256457
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем, вот пример для Oracle, который показывает, что решение с индексом будет эффективнее.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
SQL> create table big (id integer not null primary key, data varchar2( 100 ), flag char( 1 ));

Table created

SQL> insert into big select rownum, lpad('*', 100 ,'*'), null from dual connect by level<= 100000 ;

 100000  rows inserted

SQL> update big set flag = 'Y' where mod (id,  10000 ) =  0 ;

 10  rows updated

SQL> create index big_flag_i on big (flag);

Index created

SQL> create table big_flagged as select id from big where flag = 'Y';

Table created

SQL> exec dbms_stats.gather_schema_stats (ownname => user);

PL/SQL procedure successfully completed

SQL> select b.id, b.data
   2   from big b, big_flagged bf
   3   where b.id = bf.id;

....                                                                                

 10  rows selected.


Execution Plan
----------------------------------------------------------                      
Plan hash value:  4180419104                                                      
---------------------------------------------------------------------------------------------                                                                   
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |                                                                   
---------------------------------------------------------------------------------------------                                                                   
|    0  | SELECT STATEMENT             |              |     10  |   1090  |     13    ( 0 )|  00 : 00 : 01  |                                                                   
|    1  |  NESTED LOOPS                |              |     10  |   1090  |     13    ( 0 )|  00 : 00 : 01  |                                                                   
|    2  |   TABLE ACCESS FULL          | BIG_FLAGGED  |     10  |     30  |      3    ( 0 )|  00 : 00 : 01  |                                                                   
|    3  |   TABLE ACCESS BY INDEX ROWID| BIG          |      1  |    106  |      1    ( 0 )|  00 : 00 : 01  |                                                                   
|*   4  |    INDEX UNIQUE SCAN         | SYS_C0010308 |      1  |       |      0    ( 0 )|  00 : 00 : 01  |                                                                   
---------------------------------------------------------------------------------------------                                                                   
                                                                               
Predicate Information (identified by operation id):                             
---------------------------------------------------                             
                                                                                
    4  - access("B"."ID"="BF"."ID")                                               


Statistics
----------------------------------------------------------                      
           1   recursive calls                                                    
           0   db block gets                                                      
          26   consistent gets                                                    
           1   physical reads                                                     
           0   redo size                                                          
         641   bytes sent via SQL*Net to client                                   
         384   bytes received via SQL*Net from client                             
           2   SQL*Net roundtrips to/from client                                  
           0   sorts (memory)                                                     
           0   sorts (disk)                                                       
          10   rows processed                                                     

SQL> select b.id, b.data
   2   from big b
   3   where b.flag = 'Y';

.....

 10  rows selected.

Execution Plan
----------------------------------------------------------                      
Plan hash value:  2805615345                                                      
------------------------------------------------------------------------------------------                                                                      
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |                                                                      
------------------------------------------------------------------------------------------                                                                      
|    0  | SELECT STATEMENT            |            |     10  |   1060  |     11    ( 0 )|  00 : 00 : 01  |                                                                      
|    1  |  TABLE ACCESS BY INDEX ROWID| BIG        |     10  |   1060  |     11    ( 0 )|  00 : 00 : 01  |                                                                      
|*   2  |   INDEX RANGE SCAN          | BIG_FLAG_I |     10  |       |      1    ( 0 )|  00 : 00 : 01  |                                                                      
------------------------------------------------------------------------------------------                                                                      
                                                                                
Predicate Information (identified by operation id):                             
---------------------------------------------------                             
                                                                                
    2  - access("B"."FLAG"='Y')                                                   

Statistics
----------------------------------------------------------                      
           1   recursive calls                                                    
           0   db block gets                                                      
          12   consistent gets                                                    
           0   physical reads                                                     
           0   redo size                                                          
        1577   bytes sent via SQL*Net to client                                   
         384   bytes received via SQL*Net from client                             
           2   SQL*Net roundtrips to/from client                                  
           0   sorts (memory)                                                     
           0   sorts (disk)                                                       
          10   rows processed                                                     
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256467
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку.

softwarerТормоза идут как раз на "линкуется с большой".
Да нет, будет что-нибудь типа банального позиционирования по первичному ключу (не готов сходу написать, как это в планах ORACLE пишется).

softwarerИндекс тоже небольшой и тоже может быть весь в памяти.
Как раз я согласен, тут могут быть особенности ORACLE-а работы с NULL-ами в индексах. Если это не так, и индекс большой, то серверу его использовать смысла будет мало, в отличие от варианта с крошечной таблицей, пусть там даже будет "страшный" фул скан.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256471
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовДопускаю, что на ORACLE это так и будет.
Я уверен, что так будет на любом сервере. Потому что "таблица со списком id" - это фактически и есть индекс, только реализованный... необычным образом. Там, где это решение будет эффективным - трудно представить себе, что индекс будет неэффективным, и наоборот.

Сергей ВаскецовЯ бы на месте автора озаботился спецификой конкретного его сервера
Это безусловно. Надо идти в гугль и смотреть, как в конкретном сервере делать индексы по полю с перекошенным распределением значений.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256488
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовВдогонку.

softwarerТормоза идут как раз на "линкуется с большой".
Да нет, будет что-нибудь типа банального позиционирования по первичному ключу (не готов сходу написать, как это в планах ORACLE пишется).
Хм. Если я Вас правильно понял, мы говорим ровно об одном и том же.

Сергей ВаскецовКак раз я согласен, тут могут быть особенности ORACLE-а работы с NULL-ами в индексах.
Это тут незначимо. Так, как я написал, мы получим плюс в размере индекса - не хранятся данные для "неинтересных" строк. На скорость выборки по этому индексу работа с null-ами влияния не окажет - мы ведь делаем не full scan индекса, а range scan.

Сергей ВаскецовЕсли это не так, и индекс большой, то серверу его использовать смысла будет мало
Почему? Будет все то же самое - интересные блоки из этого индекса будут закешированы в памяти, а все прочее нехай себе валяется на диске, только места займет больше.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256493
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЭто безусловно. Надо идти в гугль и смотреть, как в конкретном сервере делать индексы по полю с перекошенным распределением значений. Сенкс, идея ясна, доп.таблица - лучше чем кривые индексы, индексы - правильнее, но нужно знать, как правильно настроить... пошёл в гугль
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256505
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ уверен, что так будет на любом сервере. Потому что "таблица со списком id" - это фактически и есть индекс, только реализованный... необычным образом
Попробуйте поле флага заполнить "N" для всех остальных значений, кроме "Y", и повторить эксперимент. Этим Вы увеличите размер индекса, так что ситуация изменится. Я не знаю, как MySQL 5.0.45 строит индексы по полям, где почти все значения NULL, возможно, будет также, как в Вашем примере (и тогда с индексом проще). Но может быть и обратная ситуация.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256506
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Furmanovпрошу прощения, а что есть "партиционирование" и где можно прочитать об этом?
http://www.google.ru/search?hl=ru&q=mysql+partitioning&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=0&oq=mysql+partition
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256532
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Furmanovкак правильно настроить... пошёл в гугль
Если подумать над постановкой самой задачи, я бы вообще признаки, что товар в "товарах дня" не пихал в таблицу товаров. Это в точности то же самое, как не так давно обсуждаемая тема с нумерацией товаров в прайслистах и всяких рекламных акциях. Лучше сделать отдельный заголовок (где хранить диапазон дат и прочую фигню), и к нему состав с перечнем товаров. Все равно "товар дня" обычно не просто так возникает, могут быть скидки всякие, печать перечня товаров дня (в том числе и на завтра при действующем сегодня старом перечне товаров дня) и прочие вкусности.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256533
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовПопробуйте поле флага заполнить "N" для всех остальных значений, кроме "Y", и повторить эксперимент. Этим Вы увеличите размер индекса, так что ситуация изменится.
Изменится крайне незначительно. Увеличился глубина индекса, так что придется читать на один-два блока больше. Но показанное соотношение логических чтений (в два с лишним раза) останется как есть.

Собственно, без проблем.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> update big set flag='N' where flag is null;

 99990  rows updated.

SQL> select id, data from big where flag = 'Y';

.....

 10  rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value:  2805615345  
------------------------------------------------------------------------------------------                                                                      
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |                                                                      
------------------------------------------------------------------------------------------                                                                      
|    0  | SELECT STATEMENT            |            |     10  |   1060  |     11    ( 0 )|  00 : 00 : 01  |                                                                      
|    1  |  TABLE ACCESS BY INDEX ROWID| BIG        |     10  |   1060  |     11    ( 0 )|  00 : 00 : 01  |                                                                      
|*   2  |   INDEX RANGE SCAN          | BIG_FLAG_I |     10  |       |      1    ( 0 )|  00 : 00 : 01  |                                                                      
-----------------------------------------------------------------------------------------                                                                      

Predicate Information (identified by operation id):                             
---------------------------------------------------

    2  - access("FLAG"='Y')                 

Statistics
----------------------------------------------------------
           1   recursive calls   
           0   db block gets 
          13   consistent gets
           0   physical reads
           0   redo size
        1577   bytes sent via SQL*Net to client
         384   bytes received via SQL*Net from client
           2   SQL*Net roundtrips to/from client
           0   sorts (memory)
           0   sorts (disk)
          10   rows processed
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256554
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerИзменится крайне незначительно
Спасибо. Я в общем-то так и думал, если честно, зная умение ORACLE работать с индексами. Автору рекомендую повторить Ваш эксперимент у себя.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256580
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов softwarerИзменится крайне незначительно
Спасибо. Я в общем-то так и думал, если честно, зная умение ORACLE работать с индексами. Автору рекомендую повторить Ваш эксперимент у себя.
К сожалению, вопрос решился сам собой, на серверах установлен MySQL без поддержки партишионинга (ну а хостеру его включить, конечно же, тяжелее, чем мне использовать еханизм с доп.таблицей), маразм победил разум :(
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256596
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partitioning тут не при чем. Это решение для другого случая - когда например у вас из 5000 товаров 2000 актуальных и 3000 "архивных". Виноват, при первом прочтении обратил внимание на логический признак, но пропустил информацию про перекос. При соотношении 5/5000 партиционирование.. необязательно.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35256607
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerPartitioning тут не при чем. Это решение для другого случая - когда например у вас из 5000 товаров 2000 актуальных и 3000 "архивных". Виноват, при первом прочтении обратил внимание на логический признак, но пропустил информацию про перекос. При соотношении 5/5000 партиционирование.. необязательно. понял, сейчас попробую поэкспериментировать
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257120
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Furmanov пишет:
> Вопрос профессионалам: имеет ли практический смысл индекс на boolean или
> tinyint (c 2мя - 4мя значениями)?

Нет, не имеет.

Я нутром чую, что расходов на индекс
> будет много, эффективность низкая. Ситуация такая, есть 5000 тысяч
> товаров, есть 5 товаров дня. Не хочу создавать для них отдельную
> таблицу, добавляю флажок с индексом, но спасёт ли?

ну здесь бы индекс конечно помог выборке, но дело в том, что
отношение накладухи к полезности дейтсвительно очень большое.
Поэтому лучше бы действительно сделать просто отдельный список
этих товаров дня - в отдельной маленькой таблице.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257193
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivну здесь бы индекс конечно помог выборке, но дело в том, что
отношение накладухи к полезности дейтсвительно очень большое.
Какое именно?
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257228
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAlexey Furmanov пишет:
> Вопрос профессионалам: имеет ли практический смысл индекс на boolean или
> tinyint (c 2мя - 4мя значениями)?

Нет, не имеет.
Вообще говоря - имеет, если одно значение встречается гораздо чаще других и требуется производить поиск по "редким" значениям. Над индексом стоит задумываться, когда отношение "часто" встречающегося значения к "редким" достигает порядка 50:1 (зависит от используемой СУБД).
Есть еще один вариант - использование такого поля в составном индексе в случае, если индекс является покрывающим для запроса (тоже зависит от того, умеет ли СУБД так использовать индексы).
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257326
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer пишет:
> Сереж, Вы серьезно так думаете? Чем же это решение будет наилучшим? Это
> просто неэффективная сама по себе имитация того самого индекса, который
> не будет использоваться из-за плохой селективности.

А что плохого-то в имитации индекса, который не будет использоваться ?
(что он не будет использоваться - это кстати еще бабушка надвое сказала)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257328
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer пишет:

> Cтоп! Упустил из вида, что у вас перекошенная статистика. В этом случае
> индекс - самое оно, хотя надо посмотреть, как в вашем сервере построить

Индекс - не самое оно не по этому, а потому, что 98% этого индекса не будут
использоваться. А 1-2 страницы маленькой таблицы будут очень эффективно
делать то же самое, что и здоровенный индекс в несколько тысяч страниц.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257331
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer пишет:

> Какое именно?
Этот самый индекс, который предлагается сделать.
По полю is_product_of_the_day. При выборке по условию
is_product_of_the_day = YES
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257340
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА 1-2 страницы маленькой таблицы будут очень эффективно
делать то же самое, что и здоровенный индекс в несколько тысяч страниц.
Ну-ну. Дисковое пространство нынче стоит 20-30 центов за гигабайт. Этот страшный индекс в цене вряд ли вылезет за 5 центов даже если в MySQL нет способа избежать этих гигантских трат. "Маленькая таблица" будет делать не "очень эффективно", а "медленнее, чем индекс" - потому что потребуется лишняя операция - и стоимость этого "медленно" будет нарастать по мере того, как магазин набирает обороты.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257544
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Alexey FurmanovСитуация такая, есть 5000 тысяч товаров, есть 5 товаров дня.
Cтоп! Упустил из вида, что у вас перекошенная статистика. В этом случае индекс - самое оно, хотя надо посмотреть, как в вашем сервере построить его так, чтобы он правильно использовался.

Индекс будет очень полезен для поиска именно этих 5ти товаров среди 5000 прочих товаров.

Хотя может быть экономичнее просто завести табличку в которую скопировать эти 5 товаров дня и ежедневно обновлять её.

boolean поля не очень полезны. В твоём случае вместо boolean можно добавить поле типа date, в котором указывать дату, в течении которой данный товар являлся товаром дня или что нибудь в этом роде. Используя эту дату можно будет легко находить какой товар сегодня есть товар дня, ну и частично получать данные о том, какие товары бывали в этой категории и когда это сучалось в последний раз. Т.е. развернуть значения TRUE и FALSE в более информативные.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257694
rata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Furmanov Не имеетНет смысла, т.к. избирательность такого индекса никакая
и какое решение мне подойдёт лучше? с доп.таблицей?
Индексированное представление?
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35257950
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В МССКЛ использование сабжа иногда даёт хороший эффект, но........
в МССКЛ индекс с булеан возможен только составной и только не на первом месте.
Но эффект есть..... Так что не надо ля-ля про селективность...
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35258902
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer пишет:

> Ну-ну. Дисковое пространство нынче стоит 20-30 центов за гигабайт. Этот
> страшный индекс в цене вряд ли вылезет за 5 центов даже если в MySQL нет
> способа избежать этих гигантских трат.

Это - аргументы в пользу бедных. Мне это не интересно.

"Маленькая таблица" будет делать
> не "очень эффективно", а "медленнее, чем индекс" - потому что
> потребуется лишняя операция - и стоимость этого "медленно" будет
> нарастать по мере того, как магазин набирает обороты.

Ты сам-то понял, что написал ? Теперь - прочитай и подумай.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35258911
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV пишет:
> В МССКЛ использование сабжа иногда даёт хороший эффект, но........
> в МССКЛ индекс с булеан возможен только составной и только не на первом
> месте.

boolean можно представлять не только типом bit.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35258961
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто - аргументы в пользу бедных. Мне это не интересно.
Охотно верю. "Вау! Сэкономим пять центов. Ухудшить масштабируемость - неинтересно, фигня, аргумент для бедных. Нормальные пацаны купят крутой сервер".
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35258997
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наконец-то дошли руки...
структура данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE IF NOT EXISTS `T_PRODUCT` (
  `id` int( 10 ) unsigned NOT NULL,
  `price` decimal( 12 , 4 ) default NULL,
  `is_product_of_day` tinyint( 3 ) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `is_product_of_day` (`is_product_of_day`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

CREATE TABLE IF NOT EXISTS `T_PRODUCT_OF_DAY` (
  `id` int( 10 ) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
alter table T_PRODUCT_OF_DAY add constraint FK_POD foreign key (id)
      references T_PRODUCT (id) on delete cascade on update cascade;
заполнял таким способом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?php
...
for ($i= 1 ;$i< 100001 ;$i++)
{
   $DB->executeQueryStr('insert into T_PRODUCT values('.$i.','.$i.','.((fmod($i, 1000 )== 0 )?'1':'0').')');
   if ((fmod($i, 1000 ))== 0 )
   {
	$DB->executeQueryStr('insert into T_PRODUCT_OF_DAY values('.$i.')');
   }
}
?>
грустновато, что MySQL всё же не Oracle, такой детальной статистики получить не удалось :( но всё же планы запросов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
EXPLAIN SELECT *
FROM `T_PRODUCT_OF_DAY` pd
JOIN `T_PRODUCT` pr ON ( pr.id = pd.id )
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref           | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
|   1  | SIMPLE      | pd    | index  | PRIMARY       | PRIMARY |  4        | NULL          |   100  | Using index |
|   1  | SIMPLE      | pr    | eq_ref | PRIMARY       | PRIMARY |  4        | emarket.pd.id |     1  |             |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+

EXPLAIN SELECT *
FROM `T_PRODUCT` pr
WHERE pr.is_product_of_day = 1  
+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys     | key               | key_len | ref   | rows | Extra |
+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------+
|   1  | SIMPLE      | pr    | ref  | is_product_of_day | is_product_of_day |  1        | const |    99  |       |
+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------+
поэтому попробовал провести натурные испытания :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?php
...
echo Util::getSystemTime().'<br>';
for ($i= 1 ;$i< 100001 ;$i++)
{
   $DB->executeQueryStr('SELECT * FROM `T_PRODUCT_OF_DAY` pd JOIN `T_PRODUCT` pr ON ( pr.id = pd.id )');
}
echo Util::getSystemTime().'<br>';
for ($i= 1 ;$i< 100001 ;$i++)
{
   $DB->executeQueryStr('SELECT * FROM `T_PRODUCT` pr WHERE pr.is_product_of_day = 1');
}
echo Util::getSystemTime();
?>

результат:
12:53:09.605
12:53:35.789
12:54:01.176

итого по скорости:
с доп.таблицей: 26.184 с
с индексом: 25.384 с (быстрее на 0,797 с, т.е. на ~3%)

по объёму занимаемых данных:
T_PRODUCT (100000 записей; Данные: 3,600 КБ; Индексы[2шт]: 1,552 КБ), т.е. 1,552/2 = 776 К накладных расходов (больше в ~47 раз)
T_PRODUCT_OF_DAY (100 записей; Данные: 16,384 байт), т.е. 16К накладных расходов

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


Эксперимент не учитывал влияние возможных потерь производительности, связанных с использованием языка PHP (интерпретация, библиотеки и т.п.).

Если есть замечания - с удовольствием учту и проведу эксперимент повторно.
---------------------------------------
Молодёжный научный семинар по во вопросам надёжности и гарантоспособности ПО
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35259141
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Furmanov
1. Скорее всего, данные у Вас при эксперименте целиком лежали в кэше. Не факт, что это будет соответствовать реальной картине (хотя зависит от размера базы)

2. Здесь существенен фактор нагрузки. Я не проводил натурных испытаний именно чтобы не морочиться с этим аспектом. Думаю, если подадите на сервер адекватную реальную нагрузку, разница будет куда весомее (за счет синхронизаций при параллельном доступе к данным от многих процессов).
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35259295
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVв МССКЛ индекс с булеан возможен только составной и только не на первом месте.О как. Вы о типе bit ? А в MS об этом знают ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
use tempdb
go
CREATE TABLE t (b bit)
CREATE INDEX b ON t(b)
INSERT INTO t (b) SELECT  0 
INSERT INTO t (b) SELECT  1 
INSERT INTO t (b) SELECT NULL
SELECT * FROM t
go
DROP TABLE t
Microsoft SQL Server 2000 - 8.00.2187 (Intel X86) Mar 9 2006 11:38:51 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35259337
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVВ МССКЛ использование сабжа иногда даёт хороший эффект, но........
в МССКЛ индекс с булеан возможен только составной и только не на первом месте.
Но эффект есть..... Так что не надо ля-ля про селективность...Можно в МССКЛ делать индекс на бит.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table test(id int primary key, i bit not null)
create index idx1_test on test(i)
go
insert test select id,  0  from sysobjects
insert test select top  10  -id,  1  from sysobjects
go
select * from test where i =  1 
go
drop table test
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35260277
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer1. Скорее всего, данные у Вас при эксперименте целиком лежали в кэше. Не факт, что это будет соответствовать реальной картине (хотя зависит от размера базы)

у меня заявлено 5 тысяч номенклатуры товаров, если они все будут влазить в кеш (а я уверен, что будут, на хостинге с не очень большой нагрузкой, имеется сервак MySQL с 8Г памяти), то я с задачей справился
softwarer2. Здесь существенен фактор нагрузки. Я не проводил натурных испытаний именно чтобы не морочиться с этим аспектом. Думаю, если подадите на сервер адекватную реальную нагрузку, разница будет куда весомее (за счет синхронизаций при параллельном доступе к данным от многих процессов).
да, согласен, стоило бы потестировать в несколько потоков, например командочкой ab, жаль, нет времени этим заниматься...
я для себя обозначил оба механизма как равнозначные, выбрал флажок с индексом из-за простоты использования
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35260308
Alexey Furmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabboolean поля не очень полезны. В твоём случае вместо boolean можно добавить поле типа date, в котором указывать дату, в течении которой данный товар являлся товаром дня или что нибудь в этом роде. Используя эту дату можно будет легко находить какой товар сегодня есть товар дня, ну и частично получать данные о том, какие товары бывали в этой категории и когда это сучалось в последний раз. Т.е. развернуть значения TRUE и FALSE в более информативные. не имеет смысла влазить в логику задачи, вопрос был более конкретным... если интересно, то товары дня задаются вручную, никакой автоматики и алгоритмов, не верьте названию, товаром дня является тот товар, который нужно срочно продать/прорекламировать дополнительно ;)
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35260553
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Furmanov не имеет смысла влазить в логику задачи, вопрос был более конкретным... если интересно, то товары дня задаются вручную, никакой автоматики и алгоритмов, не верьте названию, товаром дня является тот товар, который нужно срочно продать/прорекламировать дополнительно ;)

Тем более! Имея развёрнутое поле вы сможете заранее помечать товар дня на завтра, а не сидеть и не ждать, когда сегодняшний товар дня нужно будет заменить товаром дня грядущего.
...
Рейтинг: 0 / 0
Имеет ли смысл индекс на boolean?
    #35261655
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabИмея развёрнутое поле вы сможете заранее помечать товар дня на завтра, а не сидеть и не ждать, когда сегодняшний товар дня нужно будет заменить товаром дня грядущего.
Только поле типа даты также с трудом подходит для этого, потому что несколько дат туда не впихнуть. Именно поэтому решение я писал выше.
...
Рейтинг: 0 / 0
48 сообщений из 48, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Имеет ли смысл индекс на boolean?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]