powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Имеет ли смысл индекс на boolean?
25 сообщений из 48, страница 1 из 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
25 сообщений из 48, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Имеет ли смысл индекс на boolean?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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