Чи корисно проіндексувати поле datetime в mysql?


137

Я працюю над розробкою великої бази даних. У моїй програмі у мене буде багато рядків, наприклад, у мене зараз одна таблиця з 4 мільйонами записів. Більшість моїх запитів використовує пункт datetime для вибору даних. Чи корисно проіндексувати поля дати в базі даних mysql?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

Я намагаюся підтримувати роботу моєї бази даних, а запити виконуються безперебійно

Більше, на вашу думку, яку ідею ви повинні мати для створення бази даних з високою ефективністю?


Відповіді:


164

MySQL рекомендує використовувати індекси з різних причин, включаючи усунення рядків між умовами: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Це робить ваш стовпець дати відмінним кандидатом на показник, якщо ви будете використовувати його в умовах, часто в запитах. Якщо ваша єдина умова, BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)і у вас немає іншого індексу, MySQL повинен буде виконати повне сканування таблиці для кожного запиту. Я не впевнений, скільки рядків генерується за 30 днів, але поки це менше ніж 1/3 від загальної кількості рядків, ефективніше буде використовувати індекс у стовпці.

Ваше питання щодо створення ефективної бази даних дуже широке. Я б сказав просто переконатися, що він нормалізований, і всі відповідні стовпці індексуються (тобто ті, які використовуються при з'єднанні та де пункти).


3
Дякую за пояснення. Це справді допомагає. Я впевнений, що у мене буде більше фільтрів до нього. Я просто хочу переконатися, що поле індексації дати є гарною ідеєю чи ні, оскільки у нас може бути дублікат часу. але ви відповіли, це пояснили :) Дякую
Джейлен

4
+1 для "тих, які використовуються в об'єднанні, а там де". Прекрасне правило для стратегії індексації. Очевидно зараз я думаю про це, але раніше мені не приходило в
голову

1
Але якщо ви запитуєте дані з діапазоном дат , наприклад діапазоном даних від "2017-01-01 11:20" до "2018-01-03 12:12", SELECTзапит не робить швидше, навіть якщо я індексував date timeстовпчик. .. індекс зробити запит швидким, коли я використовую equalоперацію. Я прав?
користувач3595632

1
Як щодо того, якщо запитувати поля для дати з такими функціями, як DAY (datetime) або HOUR (date date). Чи допоможе індекс чи перешкоджатиме в цьому випадку?
кроноклі

Привіт @Explosion Pills, якщо мені потрібно буде лише запитувати базу таблиці за роком та місяцем, чи отримаю кращу ефективність, якщо створив новий стовпчик із лише роком та місяцем, а потім індексувати його, замість того, щоб створювати індекс стовпця datetime ? Я створюю колонку, значення якої схоже на 201801.
Вудс Чен,

18

Тут проведені автором тести показали, що цілі часові позначки unix кращі, ніж DateTime. Зауважте, він використовував MySql. Але я відчуваю, що незалежно від того, який двигун БД ви використовуєте для порівняння цілих чисел, трохи швидше порівняння дат, тому індекс-індекс кращий, ніж індекс DateTime. Візьміть Т1 - час порівняння 2 дат, Т2 - час порівняння 2 цілих чисел. Пошук в індексованому полі займає приблизно О (журнал (рядки)) час, тому що індекс, заснований на деякому збалансованому дереві - може бути різним для різних двигунів БД, але в будь-якому випадку Журнал (рядки) є загальною оцінкою. (якщо ви не використовуєте індекс на основі бітової маски або r-дерева). Отже, різниця (T2-T1) * Журнал (рядки) - може грати роль, якщо ви виконуєте запит часто.


Дякую. Я думав про це як про варіант, але не знав, як до цього підійти. Я вважаю, що ви абсолютно праві цілі числа завжди швидші.
Джейлен

62
Краще? Я сумніваюся, що часова мітка Unix краща для всіх випадків. Так, зберігання цілого числа, як правило, швидше, ніж зберігання рядка, але як бути з усіма функціями DateTime, які MySQL виставляє? Виконання їх самостійно або негативно вплине на продуктивність або функціональність.
Грег
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.