DELETE FROM jos_session WHERE

D
На сайте с 28.06.2008
Offline
1114
1279

Продолжаю мониторить лог медленных запросов у себя на сервере - теперь мое удивление вызывают запросы вида:

# Query_time: 2.368678 Lock_time: 0.000016 Rows_sent: 0 Rows_examined: 5
SET timestamp=1351673498;
DELETE FROM jos_session WHERE ( time < '1351672296' );

Записей в таблице редко когда бывает больше 2000 - почему тогда так долго выполняются такие запросы?

bay_ebook
На сайте с 28.05.2010
Offline
111
#1

индекс на поле time нужен. + желателен LIMIT, если это конечно вообще возможно.

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
D
На сайте с 28.06.2008
Offline
1114
#2

Если я правильно понимаю - индекс уже есть, или нет?

CREATE TABLE IF NOT EXISTS `jos_session` (
`username` varchar(150) DEFAULT '',
`time` varchar(14) DEFAULT '',
`session_id` varchar(200) NOT NULL DEFAULT '0',
`guest` tinyint(4) DEFAULT '1',
`userid` int(11) DEFAULT '0',
`usertype` varchar(50) DEFAULT '',
`gid` tinyint(3) unsigned NOT NULL DEFAULT '0',
`client_id` tinyint(3) unsigned NOT NULL DEFAULT '0',
`data` longtext,
PRIMARY KEY (`session_id`(64)),
KEY `whosonline` (`guest`,`usertype`),
KEY `userid` (`userid`),
KEY `time` (`time`)
) ENGINE=MyISAM DEFAULT CHARSET=u
bay_ebook
На сайте с 28.05.2010
Offline
111
#3

Индекс есть...

вот только у вас же используется time() (timestamp) - почему тогда поле varchar(14)? int(11) нужно - работать будет быстрее чем с текстовым вариантом.

D
На сайте с 28.06.2008
Offline
1114
#4

Спасибо, поле изменил - наблюдаю...

---------- Добавлено 31.10.2012 в 14:24 ----------

Нет - изменение поля никак не повлияло - запросы продолжают заносится в лог, вот последний

# Query_time: 2.145303 Lock_time: 0.000029 Rows_sent: 1 Rows_examined: 1
SET timestamp=1351678665;
SELECT * FROM jos_session WHERE session_id = 'qq37qi1d5kpubsl9sf82k84kv2';
bay_ebook
На сайте с 28.05.2010
Offline
111
#5
Dram:
Нет - изменение поля никак не повлияло - запросы продолжают заносится в лог, вот последний

Ну в первом посте у вас был delete - там точно помогло.

А тут - у вас выборка одного поля - добавлять limit 1 нужно, так как мускул без Limit ганяет всю таблицу - отсюда и задержка.

+ у вас session_id я так понимаю md5 хеш. - он всегда равен 32, почему тогда поле varchar(200) ? хватит и 32, да и индекс (праймори) тоже 64, хватит 32.

D
На сайте с 28.06.2008
Offline
1114
#6

Единственное что понял и смог сделать - это изменил в поле session_id 200 на 64

Как добавить limit 1 ?

Индекс праймори как поменять?

Вроде индекс поменял, теперь такая структура:

CREATE TABLE IF NOT EXISTS `jos_session` (
`username` varchar(150) DEFAULT '',
`time` int(11) DEFAULT NULL,
`session_id` varchar(32) NOT NULL DEFAULT '0',
`guest` tinyint(4) DEFAULT '1',
`userid` int(11) DEFAULT '0',
`usertype` varchar(50) DEFAULT '',
`gid` tinyint(3) unsigned NOT NULL DEFAULT '0',
`client_id` tinyint(3) unsigned NOT NULL DEFAULT '0',
`data` longtext,
PRIMARY KEY (`session_id`),
KEY `whosonline` (`guest`,`usertype`),
KEY `userid` (`userid`),
KEY `time` (`time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
bay_ebook
На сайте с 28.05.2010
Offline
111
#7


SELECT * FROM jos_session WHERE session_id = 'qq37qi1d5kpubsl9sf82k84kv2' LIMIT 1;

Это сам запрос изменить нужно, в коде.

Индексы - в phpmyadmin они в низу (если выбрать "структура" таблицы), под списком полей (чуть пониже чем "добавить поле")

Там список индексов, редактируются типа как поля. Несложно.

+ вроде вам индекс уже менять не нужно.

B
На сайте с 03.02.2005
Offline
165
#8

`session_id` varchar(32) NOT NULL DEFAULT '0',

не varchar а char(32), там всегда 32

Интеграция сайтов с 1С (товары, контрагенты, документы, заказы). Консультации и услуги. Есть готовые решения - быстро и недорого. Приглашаю к сотрудничеству агентства и веб-студии.
D
На сайте с 28.06.2008
Offline
1114
#9

Вот решение проблемы:

Выполняем два запроса

ALTER TABLE `jos_session` CHANGE `data` `data` VARCHAR( 5000 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
ALTER TABLE `jos_session` TYPE = memory

Тем самым переносим таблицу в оперативную память, мне помогло

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий