Kiedy indeksy mieszające stają się rozsądne?


4

MySQL natywnie nie obsługuje indeksów mieszających.Tak więc utworzenie kolumny pseudo hash i utworzenie indeksu w kolumnie mieszającej wymaga myślenia.

I wydaje się, że szeroko rozumiane jest, że jeśli pole tekstowe jest długie, to skróty są warte tego, co wymagają.Ale jak długo tekst powinien zacząć myśleć o hash?

Jeśli zamierzam użyć 128-bitowego skrótu, to ile progów znaków będzie wystarczającym minimum dla kolumny tekstowej?

EdytowaćSzczegóły wymienione w moim innym pytaniu mogą być przydatne https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram

  0

Jakie jest twoje wymaganie?Indeks wchodzi w grę tylko wtedy, gdy pojawią się zapytania w formularzu, z którego będzie korzystał optymalizator zapytań.Jaka jest natura danych, o których mowa?Jakie typy zapytań będziesz wykonywać w odniesieniu do tych danych? 14 wrz. 112011-09-14 18:18:53

3

Zaczyna być rozsądny, gdy zaczyna zapisywać dysk.Ale jednocześnie zaczyna nabierać mocy obliczeniowej.

Obecnie miejsce na dysku jest uważane za tanie, ale jeśli używasz dysku SSD, to nie jest tak tanie.Ponieważ potrzebujesz dokładnego dopasowania, nie zajmie to zbyt wiele procesora, więc może być lepszą opcją.

A dokładna odpowiedź na pytanie o długość kolumny tekstu, aby zaspokoić użycie skrótów, może się różnić w zależności od wielu czynników, począwszy od umiejętności DBA do załadowania systemu.

Ale jeśli zaoszczędzisz ponad 50% pamięci RAM przy użyciu skrótów, a całkowita oszczędność pamięci RAM wynosi co najmniej 2 GB, to myślę, że może warto wybrać tę trasę, w przeciwnym razie może to być niepotrzebne próby.


3

Nie jestem pewien, jakie są powody, dla których chcesz mieć indeks skrótu.

Ale jeśli szukasz indeksowania kolumn tekst/varchar, możesz przejść do MyISAM/pełnego tekstu lub użyć czegoś zewnętrznego, takiego jak Sphinx lub Lucene.

Alternatywnie można utworzyć dodatkową kolumnę z mieszaną wersją innej i tak długo, jak 1000 bajtów lub mniej, może być indeksowana przez MySQL.

Mam nadzieję, że odpowiedziałem na twoje pytanie.

  0

Powodem, dla którego zajrzałem do indeksu pseudo hash, jest to, że moja tabela zawiera ponad 150 milionów rekordów i mam ograniczoną pamięć (8 GB), więc chcę zoptymalizować moje indeksy i nie chcę umieszczać indeksu w kolumnie tekstowej, ponieważ będzie to zbyt dużo. BARAN. 14 wrz. 112011-09-14 17:55:51

  0

Możesz (i musisz) określić, ile znaków kolumny tekstowej chcesz zaindeksować.Tak jak w mytextcolumn (1000) - 1000 to limit.Chciałbym, aby MySQL obsługiwał część pamięci, ponieważ jest bardzo dobra z tej strony.Alternatywnie, użycie Sphinxa do tych rzeczy byłoby prawdopodobnie najbardziej odpowiednim narzędziem do tego zadania. 15 wrz. 112011-09-15 06:58:59

  0

Dlaczego powinienem umieścić indeks w kolumnie tekstowej, gdy ma zmienną długość zamiast tworzyć kolumnę mieszania i umieszczać unikalne ograniczenie w kolumnie mieszania.Jedynym problemem przy umieszczaniu indeksu na kolumnie mieszającej jest minimalizacja kolizji na jak najniższym poziomie. 15 wrz. 112011-09-15 16:42:11

  0

Możesz utworzyć kolejną mieszaną kolumnę i zindeksować ją, a także dodać własny kod do aplikacji, aby przeszukać go w ten sposób.Powiedziałbym tylko, że jest to problem, który został już rozwiązany przy użyciu innych narzędzi, a który został w dużej mierze zweryfikowany przez innych ludzi.Jeśli chcesz sprawdzić, czy Twój sposób działania jest mniej złożony, spróbuj. 16 wrz. 112011-09-16 10:41:14

  0

Właściwie są to narzędzia do wyszukiwania pełnotekstowego, takie jak sfinks.Ale jestem bardziej zainteresowany tutaj, aby wiedzieć, kiedy stanie się możliwe pobranie 16 bajtów haszy.Podobnie jak zamiast przechowywania 100 bajtów kolumny tekstu (gdy dodany indeks) warto użyć 16 bajtów.A co najważniejsze, wymagane jest tylko dopasowanie dokładne, a nie zasięg. 16 wrz. 112011-09-16 18:45:01


0

Po przeczytaniu twojego opisu mogłem zobaczyć, jak hash miałby sens.Jednak gdy mówisz o wykorzystaniu pamięci, rozmiar kolumny indeksu nie uniemożliwia wyszukiwania dużego zestawu danych.Podstawową technologią indeksowania mysql jest btree.Btrees dzielą się i podbijają.

Konkretna rada, którą mogę podać, brzmi: załóżmy, że użyjesz skrótu md5().Aby uzyskać maksymalną wydajność, należy użyć skrótu jako klucza podstawowego tabel silnika innodb, gdzie hash jest char (32).Ponieważ innodb ma indeksy klastrowe, pobieranie danych zapisuje się na dyskach, a także zmniejsza się ilość pracy, którą trzeba wykonać, gdy używa się znaku, co będzie możliwe, ponieważ wynik skrótu md5() nigdy się nie zmienia .

  0

Kiedy celem jest zaoszczędzenie pamięci RAM, użycie InnoDB byłoby mądrą decyzją? 15 wrz. 112011-09-15 16:44:51