Pracuję nad zaprojektowaniem dużej bazy danych. W mojej aplikacji będę miał wiele wierszy, na przykład obecnie mam jedną tabelę z 4 milionami rekordów. Większość moich zapytań używa klauzuli datetime do wybierania danych. Czy warto indeksować pola datetime w bazie danych mysql?
Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days
Staram się, aby moja baza danych działała dobrze, a zapytania działały płynnie
Co więcej, jak myślisz, jaki pomysł powinienem mieć, aby stworzyć bazę danych o wysokiej wydajności?
field 20
?Odpowiedzi:
MySQL zaleca używanie indeksów z różnych powodów, w tym eliminacji wierszy między warunkami: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
To sprawia, że twoja kolumna z datą i godziną jest doskonałym kandydatem na indeks, jeśli zamierzasz często używać jej w warunkach w zapytaniach. Jeśli jedynym warunkiem jest
BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)
i nie masz w nim innego indeksu, MySQL będzie musiał wykonać pełne skanowanie tabeli przy każdym zapytaniu. Nie jestem pewien, ile wierszy jest generowanych w ciągu 30 dni, ale jeśli jest to mniej niż około 1/3 wszystkich wierszy, bardziej wydajne będzie użycie indeksu w kolumnie.Twoje pytanie o stworzenie wydajnej bazy danych jest bardzo szerokie. Powiedziałbym, żeby upewnić się, że jest znormalizowany i że wszystkie odpowiednie kolumny są zindeksowane (tj. Te używane w złączeniach i klauzulach WHERE).
źródło
SELECT
zapytania, mimo że zaindeksowałemdate time
kolumnę. .. index sprawia, że zapytanie jest szybkie, kiedy używamequal
operacji .. Czy mam rację?Tutaj autor przeprowadził testy, które wykazały, że całkowity znacznik czasu unix jest lepszy niż DateTime. Uwaga, użył MySql. Ale wydaje mi się, że niezależnie od używanego silnika DB porównywanie liczb całkowitych jest nieco szybsze niż porównywanie dat, więc indeks int jest lepszy niż indeks DateTime. Take T1 - czas porównania 2 dat, T2 - czas porównania 2 liczb całkowitych. Wyszukiwanie w indeksowanym polu zajmuje około O (log (wiersze)) czasu, ponieważ indeks oparty jest na jakimś zrównoważonym drzewie - może być różny dla różnych silników DB, ale i tak Log (wiersze) to powszechne oszacowanie. (jeśli nie używasz maski bitowej lub indeksu opartego na drzewie r). Tak więc różnica jest taka (T2-T1) * Log (wiersze) - może odgrywać rolę, jeśli często wykonujesz zapytanie.
źródło