Автор Тема: SQL въпросче за индекси  (Прочетена 7026 пъти)

NorthBridge

  • Напреднали
  • *****
  • Публикации: 177
  • Distribution: Slackware-current
  • Window Manager: Enlightenment E17
  • Mad Tinkerer
    • Профил
SQL въпросче за индекси
« -: Mar 23, 2013, 08:29 »
Предварително държа да отбележа че хич ме няма в тази област.  ;D

На теория да кажем имаме база данни от 3 таблици, чиято цел е да държи инфо за даване на апартаменти, коли, каки или каквото друго се сетите под наем. Примерно:

Апартаменти
 - ID
 - адрес
 - кв.м.
Клиенти
 - ID
 - Име
 - Фамилия
Поръчки
 - ID
 - Клиент_ID
 - Апартамент_ID
 - начало на наем (дата)
 - край на наем (дата)

На пръв поглед - възможно най-простата М:N структура. Трите ID-та като Primary Keys, Клиент_ID и Апартамент_ID като Foreign Keys, останалото ясно. Да кажем обаче че в тази БД се правят заявки само върху наемите - т.е. от днес до другиден примерно търсим свободни апартаменти. В случая се получава малко кофти, понеже в третата таблица имаме 3 полета с индекси и 2 полета без, като търсим точно според тези без индекси.

Да приемем и че базата е доста голяма. В задачката се пита как да организираме цялата работа така че да направим възможно най-бързото търсене. Т.е. оставяме всичко така както си е, слагаме индекси и на последните две полета, или правим други магически трикове?  ;D

Отбелязвам и че не става въпрос за домашно или курсова работа, просто ми е любопитно какво е мнението на човек който е по-навътре в нещата :)

Активен

I did a 'zcat vmlinuz > /dev/audio' and I think I heard God...

Drago_

  • Напреднали
  • *****
  • Публикации: 34
    • Профил
Re: SQL въпросче за индекси
« Отговор #1 -: Mar 23, 2013, 10:59 »
Аз на прима виста се сещам за един грозен хак. Да си отделиш датите в отделни полета който да не са тип datetime, а smalint и примерно да имаш : start_year, end_year, start month, end_month, start_day и end_date. Но това за мен лично е работещо и в същото време грозно решение. Потърси в нета, не си първия задал този въпрос.

Тук има нещо интересно : http://hackmysql.com/case2
Активен

sudo

  • Напреднали
  • *****
  • Публикации: 73
    • Профил
Re: SQL въпросче за индекси
« Отговор #2 -: Mar 23, 2013, 17:38 »
Няма нужда да ги делиш на каквото и да било, тип char( 8 ) и формат на запис yyyymmdd е напълно достатъчен. Първо като едно текстово поле си се индексира чудесно и две работи перфектно със
Код
GeSHi (SQL):
  1. SELECT * FROM MY_TABLE WHERE SOME_DATE BETWEEN '20130301' AND '20130331';
  2. SELECT * FROM MY_TABLE WHERE SOME_DATE > '20130301';
Разбира се малко допълнителен код трябва за да форматираш датите.
Активен

jet

  • Напреднали
  • *****
  • Публикации: 3472
  • Distribution: debian
  • Window Manager: kde
    • Профил
Re: SQL въпросче за индекси
« Отговор #3 -: Mar 23, 2013, 18:27 »
за да търсиш из базите изобщо не е задължително да имаш индекси, те се правят за оптимизации, но и без тях става - едва ли имаш чак такива големи бази, че да усетиш разлика. Едно време при разни Clipper и dBase файлови бази имаше голямо значение, но не и при SQL
Активен

..⢀⣴⠾⠻⢶⣦⠀
  ⣾⠁⢠⠒⠀⣿⡁
  ⢿⡄⠘⠷⠚⠋
  ⠈⠳⣄⠀⠀⠀⠀  Debian, the universal operating system.

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: SQL въпросче за индекси
« Отговор #4 -: Mar 24, 2013, 07:41 »
1. какво е вашето виждане за голяма база, 100 милиона реда, 10 милиарда реда?
2. както отбеляза jet, не е задължително да имате индекс за да търсите по колона
3. както sudo грешно предложи има си типове дата с които базата си работи великолепно, да не говорим че формата, който sudo е предложил е много лош, ако ще сортираме YYYYMMDD е много по-добър
Активен

0x2B|~0x2B

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: SQL въпросче за индекси
« Отговор #5 -: Mar 24, 2013, 10:18 »
10 млрд. аз лично я броя малка, сляд като толкова държи дори сялите.
« Последна редакция: Mar 24, 2013, 10:24 от go_fire »
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

sudo

  • Напреднали
  • *****
  • Публикации: 73
    • Профил
Re: SQL въпросче за индекси
« Отговор #6 -: Mar 24, 2013, 10:42 »
Нещо не разбрах личното отношение, но ще го пропусна.
Мразя да пиша реферати, но явно ще трябва да се обясни подробно като за имбецили. Никъде не съм казвал да не се ползва тип данни "Дата" или сродни, казах че няма смисъл да правим отделни полета за година, месец, ден като може всичко да се събере в едно поле. Разлика м/у yyyymmdd и YYYYMMDD аз виждам само в регистъра на изписването ако някой вижда нещо друго ... и не на последно място въпроса беше "В задачката се пита как да организираме цялата работа така че да направим възможно най-бързото търсене. Т.е. оставяме всичко така както си е, слагаме индекси и на последните две полета, или правим други магически трикове?" книжките които аз съм чел за SQL казват че индексите ускоряват търсенето, което пита и колегата.
« Последна редакция: Mar 24, 2013, 10:55 от sudo »
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: SQL въпросче за индекси
« Отговор #7 -: Mar 24, 2013, 11:09 »
Судо, това което пишеш е точно така, само не разбрах, къде видя лично отношение?
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

sudo

  • Напреднали
  • *****
  • Публикации: 73
    • Профил
Re: SQL въпросче за индекси
« Отговор #8 -: Mar 24, 2013, 11:27 »
Судо, това което пишеш е точно така, само не разбрах, къде видя лично отношение?

Тебе редник те обичам  [_]3 ... че иначе модератора ... >:D
Активен

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: SQL въпросче за индекси
« Отговор #9 -: Mar 24, 2013, 11:32 »
Нещо не разбрах личното отношение, но ще го пропусна.
Мразя да пиша реферати, но явно ще трябва да се обясни подробно като за имбецили. Никъде не съм казвал да не се ползва тип данни "Дата" или сродни, казах че няма смисъл да правим отделни полета за година, месец, ден като може всичко да се събере в едно поле. Разлика м/у yyyymmdd и YYYYMMDD аз виждам само в регистъра на изписването ако някой вижда нещо друго ... и не на последно място въпроса беше "В задачката се пита как да организираме цялата работа така че да направим възможно най-бързото търсене. Т.е. оставяме всичко така както си е, слагаме индекси и на последните две полета, или правим други магически трикове?" книжките които аз съм чел за SQL казват че индексите ускоряват търсенето, което пита и колегата.
За формата на датата се извинявам, явно рано сутрин очите ми недовиждат.
А за индексите - и да и не, зависи от конкретния софтуер
Активен

0x2B|~0x2B

sudo

  • Напреднали
  • *****
  • Публикации: 73
    • Профил
Re: SQL въпросче за индекси
« Отговор #10 -: Mar 24, 2013, 11:47 »
А за индексите - и да и не, зависи от конкретния софтуер
Колега, говоря за принципната постановка, че индексите се използват за оптимизиране работата на БД.
Иначе и двамата, а най-веротно и други, знаем че една по-засукана WHERE клауза може да обезмисли индексите.  [_]3
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: SQL въпросче за индекси
« Отговор #11 -: Mar 24, 2013, 11:47 »
извън темата


Судо, това което пишеш е точно така, само не разбрах, къде видя лично отношение?

Тебе редник те обичам  [_]3 ... че иначе модератора ... >:D


Sudo нещо си в грешка. Аз не съм любимец на модераторите. Когато нарушавам правилата, а това е горе-долу често, мен също ме модерират. Не се ползвам с никакви предимства пред кой да е друг потребител. Случвало се е да ме модерират и когато съм мислел, че съм написал нещо с пълно основание, но поради странични ефекти или други причини, които не са ми били съобщавани, съм бил все пак модериран.

Тъй че няма от какво да се притесняваш, да ми кажеш каквото и да е, ако трябва на ЛС. Но аз продължавам да не виждам лично отношение, че и да се засягаш.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

angie_bg

  • Напреднали
  • *****
  • Публикации: 842
  • Distribution: Ubuntu 10.04
  • Window Manager: Gnome
    • Профил
    • WWW
Re: SQL въпросче за индекси
« Отговор #12 -: Mar 24, 2013, 11:51 »
Здравейте, използвам отворената тема, за да ме ограмотите малко:
опитвам се да направя подобна база, но за оперни постановки. Проблемът е, че често датите не са напълно уточнени:
- преди 1987 г. - тогава е имало статия, че постановката е минала, месец и дата не са ясни;
- през март 1993 г. - т. е. месецът и годината са ясни, но денят - не.
и др. подобни
Въпрос: кой ще е най-добрият начин за въвеждане на данните? Предложеният от Drago_? Вариантът на sudo ще работи ли, и ако да - как ще се филтрират/сортират "20030312" и "200303"?
Уточнение: жена ми пише дисертация и проектът е по-скоро от сексуален, отколкото от комерсиален характер.
Активен

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: SQL въпросче за индекси
« Отговор #13 -: Mar 24, 2013, 11:55 »
Здравейте, използвам отворената тема, за да ме ограмотите малко:
опитвам се да направя подобна база, но за оперни постановки. Проблемът е, че често датите не са напълно уточнени:
- преди 1987 г. - тогава е имало статия, че постановката е минала, месец и дата не са ясни;
- през март 1993 г. - т. е. месецът и годината са ясни, но денят - не.
и др. подобни
Въпрос: кой ще е най-добрият начин за въвеждане на данните? Предложеният от Drago_? Вариантът на sudo ще работи ли, и ако да - как ще се филтрират/сортират "20030312" и "200303"?
Уточнение: жена ми пише дисертация и проектът е по-скоро от сексуален, отколкото от комерсиален характер.
Най-просто е да зададете 01 за липсваща дата или месец. Е, тогава сортирането няма да работи точно, но вие и без това не можете да разчитате на него след като нямате данните. А за формат ползвайте типа дата на базата
Активен

0x2B|~0x2B

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: SQL въпросче за индекси
« Отговор #14 -: Mar 24, 2013, 11:57 »
Аз бих сложил фалшиви дати (напр. 32.13). И после в логиката на приложението, като хвана такава, просто я изчиствам и мястото ѝ остава празно или го заменям с питанка, та да се знае от четящият, че това е неизвестна информация. А може и да не съм чак толкова оргинален и за всяка информация, която не ми е известна да праскам нули и като се натъкна на нуличка, ми става много по-лесна филтрацията, отколкото за истинска дата, което не е също трудно, ако се ползва готова библиотека. По единият или другият начин, аз бих реализирал задължително логика за проверка на възможни дати, защото смятам, че това е добра практика. Фактически може да се мине без това, но по моите разбирания, си трябва.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear