Как создать индекс для части даты поля DATETIME в MySql - PullRequest
64 голосов
/ 18 сентября 2008

Как мне создать индекс для части даты поля DATETIME?

mysql> SHOW COLUMNS FROM transactionlist;
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| TransactionNumber | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| WagerId           | int(11)          | YES  | MUL | 0       |                |
| TranNum           | int(11)          | YES  | MUL | 0       |                |
| TranDateTime      | datetime         | NO   |     | NULL    |                |
| Amount            | double           | YES  |     | 0       |                |
| Action            | smallint(6)      | YES  |     | 0       |                |
| Uid               | int(11)          | YES  |     | 1       |                |
| AuthId            | int(11)          | YES  |     | 1       |                |
+-------------------+------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

TranDateTime используется для сохранения даты и времени транзакции, как это происходит

Моя таблица содержит более 1 000 000 записей и утверждение

SELECT * FROM transactionlist where date(TranDateTime) = '2008-08-17' 

занимает много времени.

РЕДАКТИРОВАТЬ:

Посмотрите на этот пост в блоге " Почему DATETIME в MySQL можно и нужно избегать "

Ответы [ 13 ]

0 голосов
/ 08 августа 2011

Создайте новые поля только с датами convert(datetime, left(date_field,10)) и затем проиндексируйте их.

0 голосов
/ 18 сентября 2008

Вместо создания индекса на основе функции (если это даже возможно в mysql) сделайте предложение where для сравнения диапазонов. Что-то вроде:

Где TranDateTime> '2008-08-17 00:00:00 'и TranDateTime < '2008-08-17 11:59:59')

Это позволяет БД использовать индекс для TranDateTime (он есть, верно?) Для выбора.

0 голосов
/ 18 сентября 2008

Что говорит «объяснить»? (запустите EXPLAIN SELECT * FROM список транзакций, где date (TranDateTime) = '2008-08-17')

Если он не использует ваш индекс из-за функции date (), запрос диапазона должен выполняться быстро:

SELECT * FROM списка транзакций, где TranDateTime> = '2008-08-17' И TranDateTime <'2008-08-18' </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...