![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 289 Pomógł: 1 Dołączył: 2.11.2007 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 695 Pomógł: 65 Dołączył: 27.07.2009 Skąd: Y Ostrzeżenie: (0%) ![]() ![]() |
hmm może zaśmiecam ale skoro wartość jest albo 0 albo 1 WYDAJE mi się żeby typ pola był tinyint
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 289 Pomógł: 1 Dołączył: 2.11.2007 Ostrzeżenie: (0%) ![]() ![]() |
nie zastanawiałem się nad tym, zwykle stosuję INT w przypadku cyfr. Czy w takim przypadku, gdzie mam wartość 0 lub 1 warto zastosować tinyint? Odbije się to w stosunku do wydajności?
|
|
|
![]()
Post
#4
|
|
![]() Newsman Grupa: Moderatorzy Postów: 4 005 Pomógł: 548 Dołączył: 7.04.2008 Skąd: Trzebinia/Kraków ![]() |
a o czymś takim jak bool nie słyszeli panowie?
-------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Ale bool w MySQL jest synonimem TINYINT(1), o ile pamiętam.
![]() Cytat Czy jest sens nakładania indeksów dla activ, gdzie wartość INT jest równa 0 lub 1? A użyj explain, to się dowiesz. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 289 Pomógł: 1 Dołączył: 2.11.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat A użyj explain, to się dowiesz. Nie używałem nigdy explain, lecz wydaje mi się, że używa się tego z poziomu linii komend mysql (a niestety do konsoli myslq nie mam dostępu). Szkoda mi teraz eksperymentować i bawić się z tym, gdyż wolałbym skorzystać z doświadczenia użytkowników forum, którzy mogą odpowiedzieć na mój problem jednym słowem. W dalszym ciągu prosiłbym o jasną odpowiedź, czy dla tinyiny(1) warto nakładać indeksy? Ten post edytował adam882 23.02.2010, 15:49:29 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 289 Pomógł: 1 Dołączył: 2.11.2007 Ostrzeżenie: (0%) ![]() ![]() |
dziękuję
![]() |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Nie używałem nigdy explain, lecz wydaje mi się, że używa się tego z poziomu linii komend mysql (a niestety do konsoli myslq nie mam dostępu). Mylisz się. Nawet phpMyAdmin ma stosownego linka do wywołania tego zapytania. ![]() Zresztą, poszukałbyś, to by Ci się nie wydawało i miałbyś odpowiedź na tacy. ![]() A co do zasadności umieszczania indeksu, to byłbym innego zdania. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
A co do zasadności umieszczania indeksu, to byłbym innego zdania. Innego, czyli że warto takowy indeks zbudować? To może ja rozwinę swoją wypowiedź "Nie". Według mnie nie warto dawać na tą kolumnę indeksu ponieważ ma bardzo małe zróżnicowanie przyjmowanych wartości (0 lub 1). Sądząc po nazwie kolumny (activ) 0 oznacza element nieaktywny, a 1 aktywny. Rekordów z 1 pewnie będzie zdecydowanie więcej niż tych z 0 i to one będę wyszukiwane. Zakładając więc indeks na taką kolumnę nie zyskamy nic poza narzutami związanymi z posiadaniem indeksu (miejsce, wolniejsza aktualizacja). Dawniej również dawałem indeksy na tego typu pola, ale po przeczytaniu książki SQL Server 2005. Programowanie. Od podstaw zmieniłem swoje podejście. |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Ok, ale książka jest do MSSQL, a temat o MySQL. Więc nie można generalizować, najpewniej porobić benchmark. Ale wciąż jestem zdania, że nie zaszkodzi ten jeden indeks więcej.
-------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
z indexem na activ zapytanie:
select * from table where activ=1 weźmie pod analize tylko rekordy z activ=1 bez indexu to samo zapytanie weźmie do analizy wszystkie rekordy. Przy milionie rekordów naprawdę odczujecie roznice ![]() Cytat nie zastanawiałem się nad tym, zwykle stosuję INT w przypadku cyfr. Czy w takim przypadku, gdzie mam wartość 0 lub 1 warto zastosować tinyint? Odbije się to w stosunku do wydajności? INT zajmuje kilka bajtów, TINYINT zajmuje jeden bajt. Przemnóż sobie teraz to przez kilka milionow i juz bedziesz wiedzial na czym zyskasz pisząc optymalnie.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 289 Pomógł: 1 Dołączył: 2.11.2007 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki. Chciałbym jednak poruszyć jeszcze kwestię ilości indeksów. Przykładowo posiadam tabelę dla ofert, gdzie blisko 20-30 pól (tinyint(1) o wartości 1 lub 0) to warunki odpowiadające kryteriom w wyszukiwarce (np. czy oferta zawiera opcję 1, opcję 2 ... opcję 20 itp. ). Chciałbym dla takich pól nałożyć indeksy, jednak czy nie będzie ich za dużo?
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
podaj przykladowe opcje. Byc moze przekombinowales i niepotrzebnie zrobiles z nich oddzielne pola tinyint. Zapewne by wystarczyło jedno pole
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 289 Pomógł: 1 Dołączył: 2.11.2007 Ostrzeżenie: (0%) ![]() ![]() |
dla ofert turystycznych mam przykładowo takie opcje (czy oferta zawiera): wyżywienie, telewizja, boisko, kuchnia, lazienka - takich pól w tabeli "oferty" mam do 30 - wszystkie tinyint(1) i zawierają jedynie wartości 1 lub 0 (jest lub nie ma). Pola te będą służyć do wyświetlenia szczegółów oferty, ale również do zaawansowanej wyszukiwarki ofert na stronie.
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
z indexem na activ zapytanie: select * from table where activ=1 weźmie pod analize tylko rekordy z activ=1 bez indexu to samo zapytanie weźmie do analizy wszystkie rekordy. Przy milionie rekordów naprawdę odczujecie roznice ![]() No ale przecież trzeba wziąć pod uwagę jaki będzie rozkład wartości 0 / 1. Najprawdopodobniej zdecydowana większość rekordów będzie miała wartość 1. Rekordy z activ=0 to będą (zapewne) nowe rekordy czekające na akceptację. Po akceptacji status zmieni się na 1, a w przypadku braku akceptacji rekord zostanie pewnie usunięty (bo po co go trzymać?). W takim przypadku z miliona rekordów robi się (strzelam) 9 990 000 rekordów ze statusem 1 i 10 000 ze statusem 0. Czy w takim przypadku "naprawdę odczujemy różnicę"? Wątpię. Jeżeli natomiast niezaakceptowane rekordy nie byłyby usuwane to może lepiej byłoby je przenieść do osobnej tabeli jako historia niezaakceptowanych wpisów. |
|
|
![]()
Post
#17
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
no, i tak jak myslalem, mozna to wszystko zapisac w jednym polu stosujac operacje bitowe.
dla typu tinyint zmiescisz 8 opcji. Jak bedziesz chciał wiecej opcji, uzyj wiekszego typu. zasada dzialania: stosowac bedziemy operacje bitowe - znasz sie co nie co na bitach? 1 bajt = 8 bitow = 00000000 - kazdy bit moze byc wykorzystany do zapisu opcji liczba 1 - opcja 1 1000 liczba 2 - opcja 2 0100 liczba 4 - opcja 3 0010 liczba 8 - opcja 4 0001 .... liczba 3 - opcja 1 i 2 1100 liczba 14 - opcja 2,4,8 0111 mniej wiecej lapiesz? jak chcesz zapisac do pola opcje 1,2,3 to robisz w php
i tą wartosc wkladasz do pola A jak w baze chcesz wyszukac pol z opcją np. 4 to musisz uzyc logicznego AND
Analogicznie reszta. Proste, nieprawdaz? ![]() Cytat No ale przecież trzeba wziąć pod uwagę jaki będzie rozkład wartości 0 / 1. Najprawdopodobniej zdecydowana większość rekordów będzie miała wartość 1. Rekordy z activ=0 to będą (zapewne) nowe rekordy czekające na akceptację a zes sie uczepil tego active... post wyzej wyraźnie pokazuje ze są to opcje turystyczne i tam juz nie ma ze wszystkie są 1 ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#18
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
a zes sie uczepil tego active... post wyzej wyraźnie pokazuje ze są to opcje turystyczne i tam juz nie ma ze wszystkie są 1 ![]() Uczepiłem się bo tego tyczył problem ![]() Swoją drogą: czy przypadkiem liczby w systemie dwójkowym nie zapisujemy "od tyłu"? Cytat liczba 1 - opcja 1 1000 Chyba raczej: Kod liczba 1 - opcja 1 0001 Nie wiem, może w MySQL działa to odwrotnie ![]() |
|
|
![]()
Post
#19
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat nie przekonałeś mnie, że stosowanie indeksu na tego typu polu ma sens. to sobie przeprowadź test ktory przedstawilem pare postow wczesniej ![]() Cytat Swoją drogą: czy przypadkiem liczby w systemie dwójkowym nie zapisujemy "od tyłu"? zależy jak leży. W różnych publikacjach różnie piszą w zależności od kontekstu. Tutaj zaś chodziło mi o wizualizacje a nie o wierne przedstawienie zapisu
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 6.07.2025 - 06:55 |