|
MySQL и индексация....
|
|||
---|---|---|---|
#18+
Я что то не пойму.... Делаю индекс на поле типа timestamp, в котором хранится время вставки записи вот так: alter table packets add index (time); Индекс добовляется.... Потом проверяю этот индекс в работе вот так: explain select * from packets where time='2003.06.20 10:00:00'; Так у меня в колонке rows показывается что выборка пройдет по всем 8 млн. записям, в колонке possible_keys написано time, в колонке key написано NULL и type ALL. Если же дабавлю индекс к полю id: alter table packets add index (id); то всё в порядке, то есть проверка: explain select * from packets where id=32; в колонке rows показывает что выборка пройдёт всего лишь по 300 тыс. записям, в колонке possible_keys написано id, в колонке key написано id и type ref. В чём трабл??? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2003, 12:17 |
|
MySQL и индексация....
|
|||
---|---|---|---|
#18+
сделай time NOT NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2003, 12:42 |
|
MySQL и индексация....
|
|||
---|---|---|---|
#18+
1) Тип timestamp никогда не бывает в значении NULL. 2) Вот тут закономеность обнаружилась странная: Данные накапливались с 1.06.03 На примере лучше всего: mysql> explain select sum(ip_totlen) from packets where ts between '2003.06.12 19:51:17' and '2003.06.19'; +---------+------+---------------+------+---------+------+---------+------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +---------+------+---------------+------+---------+------+---------+------------+ | packets | ALL | ts | NULL | NULL | NULL | 8682887 | where used | +---------+------+---------------+------+---------+------+---------+------------+ 1 row in set (0.01 sec) mysql> explain select sum(ip_totlen) from packets where ts between '2003.06.12 19:51:18' and '2003.06.19'; +---------+-------+---------------+------+---------+------+---------+------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +---------+-------+---------------+------+---------+------+---------+------------+ | packets | range | ts | ts | 4 | NULL | 1482501 | where used | +---------+-------+---------------+------+---------+------+---------+------------+ 1 row in set (0.00 sec) mysql> И этот промежуток времени сохраняется на всех записях. То есть, если мы добовляем одну секунду к промежутку, то выборка идёт по всем записям, и соответственно запрос выполняется в два раза дольше. Почему так??? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2003, 18:06 |
|
MySQL и индексация....
|
|||
---|---|---|---|
#18+
И вот ещё какую фразу нашёл в русской документации MySQL в разделе 6.5.7 Синтаксис оператора CREATE INDEX: "Следует учитывать, что в версии MySQL 3.23.2 и более поздних для таблиц типа MyISAM можно добавлять индекс только для столбцов, которые могут принимать величины NULL или для столбцов BLOB/TEXT". Как это понимать, что нельзя создать индекс на поле которое not null? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2003, 18:09 |
|
MySQL и индексация....
|
|||
---|---|---|---|
#18+
2AndreyBond, посмотрел английский оригинал, там тоже самое! Надо проверять. Выходит что так, но странно! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2003, 22:05 |
|
MySQL и индексация....
|
|||
---|---|---|---|
#18+
Нет это все фигня ты что то на тупил. Может у тебя данные в столбце выходят за какой то определенный предел. Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2003, 19:03 |
|
MySQL и индексация....
|
|||
---|---|---|---|
#18+
explain select * from packets where time='2003-06-20 10:00:00' ? т.е. вместо точек в дате воткнуть тире ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2003, 19:56 |
|
|
start [/forum/topic.php?fid=47&fpage=705&tid=1855921]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 134ms |
0 / 0 |