SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 18.04.2009 21:14:41

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

Индекс к JOIN

Здраствуйте.
Никак не пойму какой тут ещё индекс нужен или где что не так sad(

Значения IN выбраны заранее из таблицы randkey. Для удобства теста я привел строки необходимые для выполнения данного запроса.

Запрос:

SELECT `photo`.`gid` , `photo`.`apid` , `photo`.`aid` , `photo`.`pid`
FROM `photo`
JOIN `randkey` ON `randkey`.`id_photo` = `photo`.`apid`
WHERE `randkey`.`key`
IN ( 904, 2485, 2170, 1786, 2988, 2267, 995, 572, 473, 2114 )
AND `photo`.`gid` =1


Таблицы:

CREATE TABLE `randkey` (
  `gid` int(8) NOT NULL,
  `id_photo` int(8) NOT NULL,
  `key` int(8) NOT NULL,
  PRIMARY KEY  (`id_photo`),
  KEY `gid` (`gid`),
  KEY `key` (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

INSERT INTO `randkey` VALUES(1, 473, 680);
INSERT INTO `randkey` VALUES(1, 572, 777);
INSERT INTO `randkey` VALUES(1, 904, 514);
INSERT INTO `randkey` VALUES(1, 995, 976);
INSERT INTO `randkey` VALUES(26, 1786, 156);
INSERT INTO `randkey` VALUES(1, 2114, 1928);
INSERT INTO `randkey` VALUES(1, 2170, 1822);
INSERT INTO `randkey` VALUES(1, 2267, 2213);
INSERT INTO `randkey` VALUES(1, 2988, 2441);

CREATE TABLE `photo` (
  `gid` int(4) NOT NULL,
  `apid` int(8) NOT NULL auto_increment,
  `pid` int(4) NOT NULL,
  `aid` int(4) NOT NULL,
  `author` varchar(50) NOT NULL,
  `name` varchar(50) NOT NULL,
  `desc` varchar(255) NOT NULL,
  `date` datetime NOT NULL,
  `editdate` datetime NOT NULL,
  `view` int(10) NOT NULL default '0',
  `file` varchar(50) NOT NULL,
  `exif_ss` varchar(10) NOT NULL,
  `exif_vdr` varchar(10) NOT NULL,
  `exif_iso` int(4) NOT NULL,
  `exif_camera` varchar(20) NOT NULL,
  `exif_cameramodel` varchar(50) NOT NULL,
  `exif_time` datetime NOT NULL,
  `exif_width` int(4) NOT NULL,
  `exif_height` int(4) NOT NULL,
  `mfdraw` enum('da','net') NOT NULL,
  `coment` int(8) NOT NULL,
  PRIMARY KEY  (`apid`),
  KEY `gid` (`gid`,`aid`),
  KEY `aid` (`aid`,`apid`),
  KEY `bytime` (`aid`,`exif_time`),
  KEY `photo` (`pid`,`aid`,`gid`)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251

INSERT INTO `photo` VALUES(1, 473, 45, 11, '', '', '', '2008-08-05 17:00:40', '0000-00-00 00:00:00', 17, '080011966181767746131635621054', 'f/6.3', '10/1000', 200, 'Panasonic', 'DMC-FZ5', '2007-10-28 12:54:05', 1920, 2560, 'net', 0);
INSERT INTO `photo` VALUES(1, 572, 57, 12, '', '', '', '2008-08-05 17:09:28', '0000-00-00 00:00:00', 20, '432817091964784522481691711686', 'f/3.2', '10/250', 100, 'Panasonic', 'DMC-FZ5', '2007-11-08 14:18:53', 2560, 1920, 'net', 0);
INSERT INTO `photo` VALUES(1, 904, 42, 10, '', '', '', '2008-08-05 18:01:18', '0000-00-00 00:00:00', 31, '86971463633417166220802148025', 'f/3.0', '30416/1000', 128, 'OLYMPUS_IMAGING_CORP', 'X450,D535Z,C370Z', '2006-06-13 10:05:01', 1600, 1200, 'net', 0);
INSERT INTO `photo` VALUES(1, 995, 16, 16, '', '', '', '2008-08-05 18:08:32', '0000-00-00 00:00:00', 38, '404716490964166331521360865737', 'f/4.5', '6316/10000', 100, 'EASTMAN KODAK COMPAN', 'KODAK EASYSHARE C300 DIGITAL CAMERA', '0000-00-00 00:00:00', 2080, 1544, 'net', 0);
INSERT INTO `photo` VALUES(26, 1786, 27, 2, '', '', '', '2008-08-24 14:55:21', '0000-00-00 00:00:00', 37, '35398979929740014480814022069', '', '', 0, '', '', '2005-11-07 22:41:53', 178, 400, 'net', 0);
INSERT INTO `photo` VALUES(1, 2114, 60, 33, '', '', '', '2008-09-15 09:15:52', '0000-00-00 00:00:00', 53, '82905898890164586470345200879', 'f/2.8', '10/1250', 100, 'Panasonic', 'DMC-FZ18', '2008-09-13 17:21:20', 1840, 3264, 'net', 0);
INSERT INTO `photo` VALUES(1, 2170, 9, 32, '', '', '', '2008-09-15 09:24:36', '0000-00-00 00:00:00', 44, '6247752918827751761390941802', 'f/4.0', '10/2500', 100, 'Panasonic', 'DMC-FZ18', '2008-09-13 13:27:18', 3264, 1840, 'net', 0);
INSERT INTO `photo` VALUES(1, 2267, 28, 38, '', '', '', '2008-10-09 21:46:04', '0000-00-00 00:00:00', 41, '33116102675430831981859226105', 'f/5.0', '10/2000', 100, 'Panasonic', 'DMC-FZ18', '2008-10-09 17:48:12', 1840, 3264, 'net', 1);
INSERT INTO `photo` VALUES(1, 2988, 1, 42, '', '', '', '2008-11-03 21:15:38', '0000-00-00 00:00:00', 28, '38134822738793462269109774842', 'f/2.8', '10/600', 100, 'Panasonic', 'DMC-FZ18', '2008-11-03 09:47:01', 3264, 1840, 'net', 0);
 


EXPLAIN:

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1     SIMPLE     randkey     range     PRIMARY,key     key     4     NULL     10     Using where; Using index
1     SIMPLE     photo     eq_ref     PRIMARY,gid     PRIMARY     4     randkey.id_photo     1     Using where

Вот не понимаю почему в randkey range всплывает. Время выполнения запроса перманентно 0.0014-0.0025 что довольно много, учитывая что запрос впринципе не сложный. Помогите пожалуйста.

Отредактированно Proger (18.04.2009 21:16:10)

Неактивен

 

#2 18.04.2009 22:59:33

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

Re: Индекс к JOIN

range, потому что randkey.key — не уникальный ключ. Время выполнения 0.0025 секунды
эквивалентно 400 запросам в секунду. Это очень очень много smile

Неактивен

 

Board footer

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