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


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