edogs software

edogs software
Рейтинг
775
Регистрация
15.12.2005
Должность
Программирование
foxi:
Лучше не жить в москве. Зачем настоящему сеошнику москва?

"за мкадом сео нет"©

ortegas:
edogs, а смысл индекса KEY, который не в оперативке?

Что Вы подразумеваете под KEY?

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

Если индекс помещается в оперативку - это отлично. Если не помещается - все равно его наличие сильно помогает.

ortegas:
edogs, стоп-стоп. Простой это отдельный индекс для каждого поля, составной это индекс для более одного поля, верно?

Да.

siv1987:
Не глупо. использовать простой индекс там, где нужен составной... Хотя не знаю, спорить не буду, может на пару десятков миллиардов записей и есть смысл делать отдельный простой индекс по мимо составного. С такими объемами не работал.

Тут даже дело не столько в больших данных, сколько в самом принципе тестирования.

99% что у Вас весь индекс, что составной что простой, в оперативке. Значит разница даже многократная по доступу к нему - в пределах погрешности будет, особенно с учетом того что на таблице в 100к записей и целочисленном индексе - пара мегабайт дай бог объем индекса. Опять же ОС может кэшировать дисковые операции, т.е. sql_no_cache особо не решает.

Нельзя так тестить в принципе, можно получить результаты с точностью до противоположных.

siv1987:
Результат составного индекса
и честно говоря не вижу особой разницы. В таблице 100K записей

Из сказанного Вами прямо следует, что простые индексы использовать крайне глупо, ведь они "то же самое, только без бонусов составных". В подобном выводе есть легкий оттенок нелогичности, Вы так не считаете? :) Коронной идеей в данном случае будет повесить составной индекс на все поля сразу, пусть будет типа.

Еще раз - составной индекс - избыточен по отношению к простому. Это факт. Избыточность это плохо. Это тоже факт. Можно несколько поспорить на тему насколько это плохо, но это отдельный вопрос.

Что касается теста - забейте таблицу разными данными в индексируемых полях, забейте туда десяток миллионов записей, пусть размер будет хотя бы пара гигов для индексов и 10 для базы, протестируйте запросом на выборку с benchmark 10000 а не разовым sql_no_cache, посчитайте время построения индекса заодно, не забудьте протестировать скорость вставках с тем же бенчмарком - тогда это будет тест что-то показывающий. А пара одиночных запросов на неизвестно каких данным, на крошечных индексах и неизвестно как закэшированных данных (ФС тоже кэширует) - это не тест, а фикция.

ortegas:
edogs, спасибо. Даже не декоративное, а максимальное количество цифр.

По мануалу да, но непонятно где и как используется на практике. tinyint(1) вполне себе нормально хранит число 120.

Единственное где это вроде бы еще важно, это при джоинах таблиц по индексам. int (10) с int (11) вроде как не идеально склеивается по индексам. Но не вдавались в детали.

ortegas:
Чтобы не создавать новую тему, спрошу. Есть ли смысл, использовать TINYINT, когда явно указываешь размер. То-есть, TINYINY против INT(3)?

У int-овых типов данных, в отличии от текстовых полей, число в скобках отношения к размеру занимаемых данных не имеет никакого, оно упрощенно говоря несет в себе чисто декоративный смысл в данном контексте.

ortegas:
Тоже об этом подумал. Вот как раз от таких казусов и защищает стандарт. Прикольно, но тем у кого, номер означает GJDKFJJ не очень. :)

К номеру gjdkfjj наверняка можно подобрать более красивую расшифровку:) Фокус-то в том, что одной цифре соответствуют 3 буквы на выбор.

siv1987:
Это почему, если используется первая часть индекса?

Потому что индекс на country+phone, а не на country. Избыточность менее эффективна.

siv1987:
Вообще-то говорят что в данном случае будет.

В зависимости от оптимизатора sql. Не зря в мануалах специально указывают, что если хочется гарантированно использовать составной индекс, то в where нужно использовать тот же порядок, что и при задании индекса.

ortegas:
Нормальные формы как раз и созданы, чтобы максимально защитить целостность данных.

Вы немного не верно смысл нормальных форм понимаете в данном контексте.

Нормальные формы фиксят ситуацию вида "имя васи хранится в двух местах" принципом вида "пихнем имя васи в одно место и сделаем на него ссылки". Тем самым изменяя данные васи их не нужно апдейтить данные в двух местах, достаточно в одном, поэтому целостность улучшается.

В Вашем случае, EAV разбитое по разным таблицам, это хранение данных контакта в нескольких разных местах, то есть ситуация прямо противоположно направленная сохранению целостности данных. Вместо одного места - Вы разносите их в несколько.

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

ortegas:
Друзья, объясните, когда можно использовать один KEY для двух значений?

Когда это имеет смысл.

Если индекс типа country+phone, то поиск where country+phone будет эффективнее остальных вариантов.

Однако where phone будет без индекса вообще, а where country будет менее эффективным.

Так же phone+country скорее всего (в зависимости от оптимизатора скл) работать не будет с таким индексом.

ortegas:
Если я хочу, чтобы целый номер country + phone был уникальным, по аналогии, нужно создавать один ключ UNIQUE?

Да, верно.

---------- Добавлено 13.09.2013 в 21:07 ----------

DenisVS:
int.
Храните номера в соответствии со стандартом E.164. Символы, отличные от цифр, не нужны.

1-800-MY-APPLE ?

ortegas:
Stek, ну пока что я решил привести таблицу к 3 нормальному виду. То-бишь, под каждое значение - своя таблица + строгая типизация для полей + учет. Критика?

Для хранения - нормально.

Для вставки - Х запросов вместо одного, приложение должно будет само решать вопросы целостности данных.

Для поиска - как Вы будете искать в контактах человека у которого в телефоне есть вхождение 812 (одна таблица), при этом он носит белые штаны (другая таблица) и никогда не был в рио-де-жанейро (третья таблица + негативная выборка) но при этом был в москве (третья таблица и позитивная выборка)? EAV усложняет эту задачу само по себе, а несколько таблиц забивают гвоздь в крышку гроба:)

Всего: 12159