Задавайте вопросы, мы ответим
Вы не зашли.
Запрос (выбрать поле дата-время с последней записи у которойdata_key_pins=X)
Неактивен
А индексы какие? Explain, все дела...
Неактивен
-- Структура таблицы '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 секунд....
Неактивен
Пытался сделать индекс на поле data_key_pins - скорость обработки запросы выросла до 6 секунд....
Ну тут Вы что-то напутали, извините не верю.
EXPLAIN
Если "data_date_time" растет пропорзионал'но "data_key". Скажем если это дата вставления записи.
То выигрыш во времени будет если:
Неактивен
termsl написал:
Пытался сделать индекс на поле data_key_pins - скорость обработки запросы выросла до 6 секунд....
Я тоже не верю. Индексов нет - вот и 1.5 секунды (и это еще нормально для 1М записей). Сделайте составной индекс (`data_date_time`, `data_key_pins`) - посмотрите результат. Будет тормозить - сделайте EXPLAIN запроса и результат напишите здесь.
Неактивен
Shopen написал:
termsl написал:
Пытался сделать индекс на поле data_key_pins - скорость обработки запросы выросла до 6 секунд....
Я тоже не верю. Индексов нет - вот и 1.5 секунды (и это еще нормально для 1М записей). Сделайте составной индекс (`data_date_time`, `data_key_pins`) - посмотрите результат. Будет тормозить - сделайте EXPLAIN запроса и результат напишите здесь.
Наоборот только:
(`data_key_pins`, `data_date_time`)
Неактивен
Поддерживаю последнего оратора Сначала WHERE, потом ORDER.
Неактивен
Ну я просто скопипастил имена не в том порядке, зато в моем варианте mysql будет работать только с индексом
Неактивен
Подскажите плиз, как сделать:
1. Составной индекс(`data_key_pins`, `data_date_time`)
2. Сделать EXPLAIN запроса.
Я достаточно давно работаю с mysql, но для моих задач вполне хватало не особо сложных запросов и с вопросами оптимизации я не сталкивался...
Отредактированно termsl (08.09.2010 17:36:05)
Неактивен
Сделать два запроса:
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)
Неактивен
Вот результат 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 сек
Спасибо огромадецкое!
Пояснить если можно для понимания- стала структура таблицы такой:
Неактивен
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 сек), какой предпочтительнее?
Это вообще говоря _совсем_ другой запрос. Ничего что он вернет другой результат? Скорость все равно подзрительно большая, уверены что она без индексов такая?
Неактивен
А теперь уберите индекс и попробуйте то, что порекомендовали
Именно так — потому что индекс используется слева направо. И запрос
выполняется сначала WHERE, а потом ORDER. Кстати, то, что порекомен-
довали — тоже использует этот индекс. Cначала pins, а потом time.
Неактивен
Shopen написал:
termsl написал:
rows - 590725
Что то как то много строк, у вас этих data_key_pins вариантов сколько, 4-5?
Там LIMIT 1
Неактивен
data_key_pins - 20-30
Я как запросы начали тормозить, перевел логику на использование запроса
Отредактированно termsl (08.09.2010 19:10:23)
Неактивен
Shopen написал:
Ну я просто скопипастил имена не в том порядке, зато в моем варианте mysql будет работать только с индексом
Жаль у меня пирожки на полке закончились. Я бы Вам один выдал.
Это разные запросы:
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';
Используйте тот который Вам необходим (дает правильный результат)
Неактивен
Я знаю, что запросы разные, но они решают одну и ту же задачу, мне по сути до фени, какой использовать, оба нормально решают задачу, вопрос в том какой правильнее, лучше с индексами или без и кто менее нагружает mysqld....
Неактивен
Это философский вопрос. Особенно если ни один из запросов не нагружает
базу. Если индекс оставить, то они одинаково хороши (или одинаково плохи —
как посмотреть).
Неактивен
Так, так )))) чем плохи ))) как из них супер-пупер конфету сваять?
Неактивен
SELECT 'супер-пупер конфета' FROM ( и тут Ваш запрос ) s;
Неактивен
Всем спасибо, за внимание и тыканье носом )))
Неактивен