SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.02.2009 13:25:16

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Вопрос по хранилищю MEMORY

Что-то не могу понять. Перевёл таблицу где учитываются пользователи онлайн на хранилище MEMORY.
Всё вошло сразу в память, но индексы не работают никакие кроме первичного. Это нормально? Напротив остальных индексов стоит 0. В таблице типа MYISAM они играли роль не малую, а тут индексы памяти не касаются что ли? Просто понять не могу.
Также пишет что таблица фрагментирована, однако OPTIMIZE TABLE не исправляет сие штуку. Это тоже нормально?
Вообще хотелось бы пояснений, заранее спасибо.

Неактивен

 

#2 05.02.2009 13:44:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вопрос по хранилищю MEMORY

Таблички MEMORY отличаются от табличек MyISAM в первую очередь тем, что индексы (без явного
указания) строятся как HASH, а не как BTREE. Соответственно, на запросах типа ">=" они не работают.

Что касается "стоит 0", "пишет, что фрагментирована" - где стоит и где пишет? smile

Неактивен

 

#3 05.02.2009 13:48:28

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Вопрос по хранилищю MEMORY

Гм то есть мои все индексы идут нафег... А это очень играет на производительности? или поскольку в памяти, то не будет ощютимо замедление производительности?

В phpmyadmin smile

ADD: вот сейчас на сайте 2 человека и один есть в индесах. По какой логике это происходит не пойму. Типы индексов и структуру таблицы не менял тупо сменил STORAGE ENGINE.

Отредактированно Proger (05.02.2009 13:50:03)

Неактивен

 

#4 05.02.2009 15:15:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вопрос по хранилищю MEMORY

Когда делаете индекс - напишите в явном виде тип индекса для диапазонных случаев:
ALTER TABLE tablename ADD INDEX idxname (columnname) USING BTREE;

P.S. phpmyadmin - бяка smile

Неактивен

 

#5 05.02.2009 19:52:24

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Вопрос по хранилищю MEMORY

Mysql Query Browser вроде позволяет BTREE крутить...

Знаю, но удобно блин...

Спасибо, понял wink

Неактивен

 

#6 11.02.2009 14:46:17

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Вопрос по хранилищю MEMORY

Поднимаю тему ибо...
Поменял индексы на BTREE дык вообще понулям все индексы (в том числе и примари). Притом любой EXPLAIN простейшего запроса с условием = >= и т.п. выводит что ключей вообще нет. FORCE INDEX может в данном случае помочь?

Отредактированно Proger (11.02.2009 14:46:29)

Неактивен

 

#7 11.02.2009 14:57:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Вопрос по хранилищю MEMORY

Приведите более конкретный пример, чтобы можно было воспроизвести. FORCE INDEX не поможет

Неактивен

 

#8 11.02.2009 20:09:29

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Вопрос по хранилищю MEMORY

Дамп:

CREATE TABLE `online` (
  `sid` varchar(32) NOT NULL,
  `uid` int(4) NOT NULL default '0',
  `name` varchar(20) NOT NULL,
  `time` int(12) NOT NULL,
  `ip` varchar(15) default NULL,
  `where_type` varchar(11) NOT NULL default 'index',
  `where_id` int(8) default NULL,
  `where_id1` int(8) default NULL,
  `where_id2` int(8) default NULL,
  `xstas` tinyint(2) NOT NULL default '0',
  PRIMARY KEY  USING BTREE (`sid`),
  KEY `uid` USING BTREE (`uid`,`xstas`),
  KEY `time` USING BTREE (`time`),
  KEY `uid_2` USING BTREE (`uid`)
) ENGINE=MEMORY DEFAULT CHARSET=cp1251;
-----
INSERT INTO `online` VALUES('ea4af0eb1305d62916c241ec9c718ef6', 1, 'BM', 1234371447, '00.000.00.000', 'forum', 1, 1, 100, 1);
INSERT INTO `online` VALUES('d0d92e175c4efcd224814fab30e50b48', 0, 'Гость', 1234372039, '00.000.00.000', 'photo', 3, 30, 46, 0);


Запрос вида SELECT * FROM `online` WHERE `time` >= 1234372039

Отредактированно Proger (11.02.2009 20:09:47)

Неактивен

 

#9 11.02.2009 20:13:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Вопрос по хранилищю MEMORY

У меня все в порядке:

mysql> EXPLAIN SELECT * FROM `online` WHERE `time` >= 1234372039 ;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | online | range | TIME          | TIME | 4       | NULL |    2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
 

Неактивен

 

#10 11.02.2009 20:44:38

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Вопрос по хранилищю MEMORY

хм как интерестно... у меня possible_keys NULL key NULL...
щаз попробую через консоль сделать это же... до этого я пробывал через phpmyadmin с удалённой машины...

Неактивен

 

#11 11.02.2009 20:50:34

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Вопрос по хранилищю MEMORY

mysql> EXPLAIN SELECT * FROM `online` WHERE `time` >= 1234372039;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | online | range | time          | time | 4       | NULL |    2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)


Как интерестно... phpmyadmin то чего так тупит то... Ладно спасибо, буду знать сие особенность. Вообще phpmyadmin как то странно работает с хранилищем MEMORY.

ADD теперь и в phpmyadmin EXPLAIN работает. Ничего вообще не понимаю. Правда до этого я смотрел explain запроса с условием на другое поле, но разница то... кароче прошу прощения за беспокойство.

Отредактированно Proger (11.02.2009 20:52:27)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson