Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица в которой несколько млн. записей. В моём запросе нужно выбрать запись с выбранным серийным номером и IP последнюю запись, которая выбирается по макс индексу. Вот 2 варианта, по времени они практически одинаковы, а надо ещё быстрее...
SELECT smt.Data, smt.Time, smt.Topicality, smt.Temperature FROM smt WHERE (smt.Index = (select MAX(smt.Index) from smt where smt.SNumber='000002B5C588' AND smt.IP = '10.0.1.72'));
SELECT smt.Data, smt.Time, smt.Topicality, smt.Temperature FROM smt WHERE smt.SNumber='000002B5C588' AND smt.IP = '10.0.1.72' order BY smt.Index desc Limit 1
CREATE TABLE `smt` (
`IP` CHAR(15) NOT NULL DEFAULT '0.0.0.0',
`Data` DATE NOT NULL DEFAULT '2011-01-31',
`Time` TIME NOT NULL DEFAULT '00:00:00',
`SNumber` CHAR(12) NOT NULL DEFAULT '000000000000',
`Temperature` CHAR(8) NOT NULL DEFAULT '-000.000',
`Period` CHAR(5) NOT NULL DEFAULT '12345',
`Topicality` CHAR(1) NOT NULL DEFAULT '0',
`Repetition` CHAR(2) NOT NULL DEFAULT '0',
`W_Data` DATE NULL DEFAULT '2011-06-07',
`W_Time` TIME NULL DEFAULT '00:00:00',
`Index` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`Index`),
INDEX `SNumber` (`SNumber`),
INDEX `IP` (`IP`),
INDEX `Data` (`Data`, `Time`),
INDEX `W_Data_W_Time` (`W_Data`, `W_Time`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=6629160
Для первого:
|| *id* || *select_type* || *table* || *type* || *possible_keys* || *key* || *key_len* || *ref* || *rows* || *Extra* ||
|| 1 || SIMPLE || smt || index_merge || SNumber,IP || SNumber,IP || 36,45 || _NULL_ || 170152 || Using intersect(SNumber,IP); Using where; Using filesort ||
Для второго:
|| *id* || *select_type* || *table* || *type* || *possible_keys* || *key* || *key_len* || *ref* || *rows* || *Extra* ||
|| 1 || SIMPLE || smt || index_merge || SNumber,IP || SNumber,IP || 36,45 || _NULL_ || 175190 || Using intersect(SNumber,IP); Using where; Using filesort ||
Неактивен
Мне второй запрос нравится больше
Ключик добавьте на (SNumber, IP, Index).
Неактивен