SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 07.09.2010 09:05:51

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Простой SELECT выполняется 1,5 сек?

Запрос (выбрать поле дата-время с последней записи у которойdata_key_pins=X)

SELECT `data_date_time` FROM `data` WHERE `data_key_pins` ="3" ORDER BY `data_date_time` DESC LIMIT 1';


В базе:
data_key              int(11)                 auto_increment  key
data_key_pins     int(11)        
data_date_time     datetime
data_value       int(11)

Выполняется 1,5 сек. В базе чуть более 1 000 000 записей, и она растет. INSERT в эту базу выполняется милисекунды, что за оптимизировать, подскажите.

Неактивен

 

#2 07.09.2010 11:24:36

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Простой SELECT выполняется 1,5 сек?

А индексы какие? Explain, все дела...

Неактивен

 

#3 07.09.2010 11:33:57

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Re: Простой SELECT выполняется 1,5 сек?

-- Структура таблицы 'data'
--

CREATE TABLE `data` (
  data_key int(11) NOT NULL AUTO_INCREMENT,
  data_key_pins int(11) NOT NULL,
  data_date_time datetime DEFAULT NULL,
  data_value int(11) DEFAULT '0',
  PRIMARY KEY (data_key)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin;


Пытался сделать индекс на поле data_key_pins  - скорость обработки запросы выросла до 6 секунд....

Неактивен

 

#4 07.09.2010 16:28:21

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Простой SELECT выполняется 1,5 сек?

Пытался сделать индекс на поле data_key_pins  - скорость обработки запросы выросла до 6 секунд....

Ну тут Вы что-то напутали, извините не верю.
EXPLAIN

Если "data_date_time" растет пропорзионал'но "data_key". Скажем если это дата вставления записи.
То выигрыш во времени будет если:

ORDER BY `data_key` DESC

вместо
ORDER BY `data_date_time` DESC

Неактивен

 

#5 07.09.2010 17:00:27

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Простой SELECT выполняется 1,5 сек?

termsl написал:

Пытался сделать индекс на поле data_key_pins  - скорость обработки запросы выросла до 6 секунд....

Я тоже не верю. Индексов нет - вот и 1.5 секунды (и это еще нормально для 1М записей). Сделайте составной индекс (`data_date_time`, `data_key_pins`) - посмотрите результат. Будет тормозить - сделайте EXPLAIN запроса и результат напишите здесь.

Неактивен

 

#6 07.09.2010 17:38:02

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Простой SELECT выполняется 1,5 сек?

Shopen написал:

termsl написал:

Пытался сделать индекс на поле data_key_pins  - скорость обработки запросы выросла до 6 секунд....

Я тоже не верю. Индексов нет - вот и 1.5 секунды (и это еще нормально для 1М записей). Сделайте составной индекс (`data_date_time`, `data_key_pins`) - посмотрите результат. Будет тормозить - сделайте EXPLAIN запроса и результат напишите здесь.

Наоборот только:
(`data_key_pins`, `data_date_time`)

Неактивен

 

#7 07.09.2010 20:19:23

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

Re: Простой SELECT выполняется 1,5 сек?

Поддерживаю последнего оратора smile Сначала WHERE, потом ORDER.

Неактивен

 

#8 07.09.2010 22:30:20

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Простой SELECT выполняется 1,5 сек?

Ну я просто скопипастил имена не в том порядке, зато в моем варианте mysql будет работать только с индексом smile

Неактивен

 

#9 08.09.2010 17:34:53

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Re: Простой SELECT выполняется 1,5 сек?

Подскажите плиз, как сделать:

1. Составной индекс(`data_key_pins`, `data_date_time`)
2. Сделать EXPLAIN запроса.

Я достаточно давно работаю с mysql, но для моих задач вполне хватало не особо сложных запросов и с вопросами оптимизации я не сталкивался...

Отредактированно termsl (08.09.2010 17:36:05)

Неактивен

 

#10 08.09.2010 17:51:47

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Простой SELECT выполняется 1,5 сек?

Сделать два запроса:
1. ALTER TABLE data ADD KEY (`data_key_pins`, `data_date_time`)
2. Перед тем запросом который у вас тормозит написать слово EXPLAIN

Впрочем думаю, что explain не понадобится, т.к. после добавления индекса ваш запрос скорее всего станет очень шустрым
P.S. Странно, что вы работаете с mysql давно и не знаете как сделать индекс

Отредактированно Shopen (08.09.2010 17:59:08)

Неактивен

 

#11 08.09.2010 18:34:27

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Re: Простой SELECT выполняется 1,5 сек?

Вот результат EXPLAIN:

id     select_type     table     type     possible_keys     key     key_len     ref     rows         Extra
1     SIMPLE         data     ALL     NULL             NULL     NULL         NULL     1106308     Using where; Using filesort

После ALTER TABLE data ADD KEY (`data_key_pins`, `data_date_time`)

id     select_type     table     type     possible_keys     key             key_len     ref         rows         Extra
1     SIMPLE         data     ref     data_key_pins     data_key_pins     4         const     590725     Using where; Using index

Чума просто!!!!
0.0007 сек

Спасибо огромадецкое!

Пояснить если можно для понимания- стала структура таблицы такой:


CREATE TABLE IF NOT EXISTS `data` (
  `data_key` int(11) NOT NULL AUTO_INCREMENT,
  `data_key_pins` int(11) NOT NULL,
  `data_date_time` datetime DEFAULT NULL,
  `data_value` int(11) DEFAULT '0',
  PRIMARY KEY (`data_key`),
  KEY `data_key_pins` (`data_key_pins`,`data_date_time`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin AUTO_INCREMENT=2449384 ;
 


Почему именно так -
KEY `data_key_pins` (`data_key_pins`,`data_date_time`)


И еще вопрос, мне порекомендоваои вместо первоначального запроса использовать такой:
SELECT * FROM `data` WHERE `data_date_time` > "2010-09-08 18:30:00" AND data_key_pins = "1"

Он реально, даже без индексов, по быстродействию как первоначальный с индексами ( 0.0007-0.0008 сек), какой предпочтительнее?

Неактивен

 

#12 08.09.2010 18:44:33

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Простой SELECT выполняется 1,5 сек?

termsl написал:

rows - 590725

Что то как то много строк, у вас этих data_key_pins вариантов сколько, 4-5?

termsl написал:

Почему именно так -
KEY `data_key_pins` (`data_key_pins`,`data_date_time`)

А что именно смущает? По умолчанию mysql дает индексу имя по названию первого поля в него входящего.


termsl написал:

И еще вопрос, мне порекомендоваои вместо первоначального запроса использовать такой:

SELECT * FROM `data` WHERE `data_date_time` > "2010-09-08 18:30:00" AND data_key_pins = "1"

Он реально, даже без индексов, по быстродействию как первоначальный с индексами ( 0.0007-0.0008 сек), какой предпочтительнее?

Это вообще говоря _совсем_ другой запрос. Ничего что он вернет другой результат? Скорость все равно подзрительно большая, уверены что она без индексов такая?

Неактивен

 

#13 08.09.2010 18:49:04

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

Re: Простой SELECT выполняется 1,5 сек?

А теперь уберите индекс и попробуйте то, что порекомендовали wink

Именно так — потому что индекс используется слева направо. И запрос
выполняется сначала WHERE, а потом ORDER. Кстати, то, что порекомен-
довали — тоже использует этот индекс. Cначала pins, а потом time.

Неактивен

 

#14 08.09.2010 18:49:37

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

Re: Простой SELECT выполняется 1,5 сек?

Shopen написал:

termsl написал:

rows - 590725

Что то как то много строк, у вас этих data_key_pins вариантов сколько, 4-5?

Там LIMIT 1 wink

Неактивен

 

#15 08.09.2010 19:04:32

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Re: Простой SELECT выполняется 1,5 сек?

data_key_pins - 20-30

Я как запросы начали тормозить, перевел логику на использование запроса

SELECT * FROM `data` WHERE `data_date_time` > "2010-09-08 18:30:00" AND data_key_pins = "1"
он на самом деле без индексов выполняется макс 0.0008 сек. Мне надо в момент поступления новых данных узнать не прошло ли с момента последней записи времени больше чем период логгирования, и если так- заинсертить новую запись, соответственно первоначально я селектил последнюю запись по конкретному пину, и если разница по времени была больше, то инсертил, а после тормозов начал смотреть есть ли запись по данному пину со временем равным сейчас минус период обновления, и если ее нет то вставляю значение.

Тот человек, который мне это порекомендовал, объяснил это тем, что изначально ORDER BY медленно выполняется.
Вот я сейчас и нахожусь на распутье - оставить
SELECT * FROM `data` WHERE `data_date_time` > "2010-09-08 18:30:00" AND data_key_pins = "1"
без индексов (сейчас он отрабатывает за 0.0002-0.0010 сек видимо в зависимости от загруженности mysqld) или использовать старый
SELECT `data_date_time` FROM `data` WHERE `data_key_pins` ="3" ORDER BY `data_date_time` DESC LIMIT 1';
запрос....

Отредактированно termsl (08.09.2010 19:10:23)

Неактивен

 

#16 08.09.2010 19:14:09

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Простой SELECT выполняется 1,5 сек?

Shopen написал:

Ну я просто скопипастил имена не в том порядке, зато в моем варианте mysql будет работать только с индексом smile

Жаль у меня пирожки на полке закончились. Я бы Вам один выдал. big_smile

Это разные запросы:
SELECT * FROM `data` WHERE `data_date_time` > "2010-09-08 18:30:00" AND data_key_pins = "1"
SELECT `data_date_time` FROM `data` WHERE `data_key_pins` ="3" ORDER BY `data_date_time` DESC LIMIT 1';

Используйте тот который Вам необходим (дает правильный результат)

Неактивен

 

#17 08.09.2010 19:26:01

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Re: Простой SELECT выполняется 1,5 сек?

Я знаю, что запросы разные, но они решают одну и ту же задачу, мне по сути до фени, какой использовать, оба нормально решают задачу, вопрос в том какой правильнее, лучше с индексами или без и кто менее нагружает mysqld....

Неактивен

 

#18 08.09.2010 19:43:38

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

Re: Простой SELECT выполняется 1,5 сек?

Это философский вопрос. Особенно если ни один из запросов не нагружает
базу. Если индекс оставить, то они одинаково хороши (или одинаково плохи —
как посмотреть).

Неактивен

 

#19 08.09.2010 19:45:33

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Re: Простой SELECT выполняется 1,5 сек?

Так, так )))) чем плохи ))) как из них супер-пупер конфету сваять?

Неактивен

 

#20 08.09.2010 20:01:01

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

Re: Простой SELECT выполняется 1,5 сек?

SELECT 'супер-пупер конфета' FROM ( и тут Ваш запрос ) s; wink

Неактивен

 

#21 08.09.2010 20:48:35

termsl
Участник
Зарегистрирован: 07.09.2010
Сообщений: 8

Re: Простой SELECT выполняется 1,5 сек?

Всем спасибо, за внимание и тыканье носом )))

Неактивен

 

Board footer

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