SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 14.12.2011 11:15:29

lexikon
Участник
Зарегистрирован: 14.12.2011
Сообщений: 13

SELECT DISTINCT - 6 секунд

Есть 2 таблицы
kz_plrstats 20,000 записей
kz_stats - 162,000 записей

Есть запрос который берет инфу с двух таблиц и сортирует её по полю, выводит с помощью LIMIT кол-во записей для постраничной навигации. Вообщем если в таблице kz_plrstats в поле country определенной стране принадлежит много записей...то запрос выполняется по 6 секунд sad
Могли бы помочь как то оптимизировать его?(

SELECT DISTINCT s.name, p.procount, p.mapcount,p.ingame, p.country,p.authid FROM `kz_plrstats` p, `kz_stats` s WHERE p.country='ru' AND p.authid=s.authid ORDER BY p.procount DESC,ingame DESC LIMIT 0, 50

Неактивен

 

#2 14.12.2011 14:20:24

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: SELECT DISTINCT - 6 секунд

Выполнение данного запроса ускорит составной индекс на полях s.authid и s.name. Также пригодится индекс на p.country.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#3 14.12.2011 14:22:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SELECT DISTINCT - 6 секунд

покажите структуру таблиц (т.е. результат команд show create table kz_plrstats и show create table kz_stats)
и план выполнения запроса - explain ваш запрос;

Неактивен

 

#4 14.12.2011 21:42:58

lexikon
Участник
Зарегистрирован: 14.12.2011
Сообщений: 13

Re: SELECT DISTINCT - 6 секунд

kz_plrstats

CREATE TABLE `kz_plrstats` (
  `country` varchar(6) NOT NULL,
  `authid` varchar(64) NOT NULL,
  `mapcount` double NOT NULL DEFAULT '0',
  `procount` double NOT NULL DEFAULT '0',
  `firstseen` datetime NOT NULL,
  `lastseen` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ingame` double NOT NULL DEFAULT '0',
  UNIQUE KEY `authid` (`authid`),
  KEY `country` (`country`),
  KEY `procount` (`procount`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

kz_stats
CREATE TABLE `kz_stats` (
  `mapname` varchar(64) NOT NULL,
  `country` varchar(6) NOT NULL,
  `authid` varchar(64) NOT NULL,
  `name` varchar(64) NOT NULL,
  `time` decimal(65,6) NOT NULL,
  `date` datetime NOT NULL,
  `weapon` varchar(64) NOT NULL,
  `gocheck` int(11) NOT NULL,
  `checkpoint` int(11) NOT NULL,
  `type` varchar(64) NOT NULL,
  KEY `date` (`date`),
  KEY `time` (`time`),
  KEY `mapname` (`mapname`),
  KEY `country` (`country`),
  KEY `authid` (`authid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

План выполнения запроса:
1    SIMPLE    s    ALL    authid    NULL    NULL    NULL    162329    Using temporary; Using filesort
1    SIMPLE    p    eq_ref    authid,country    authid    194    amxx.s.authid    1    Using where

Неактивен

 

#5 15.12.2011 00:36:09

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

Re: SELECT DISTINCT - 6 секунд

Я бы попробовал поменять ключики. Нужен на p (country, procount, ingame).

Неактивен

 

#6 15.12.2011 08:59:55

lexikon
Участник
Зарегистрирован: 14.12.2011
Сообщений: 13

Re: SELECT DISTINCT - 6 секунд

последющий запрос точно такой же уже будет  0.0006 сек - кешированный видимо
как бы сделать первоначальный запрос быстрее(( когда лазишь по веб-скрипту...на 4 сек фризит страничку sad((

как поменять ключики?


тут речь была о составном индексе...что это такое?
поле authid содержит ид буквенно-численные...имеет ли смысл для полей этих использовать FULLTEXT индекс?

Отредактированно lexikon (15.12.2011 09:13:50)

Неактивен

 

#7 15.12.2011 15:00:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: SELECT DISTINCT - 6 секунд

paulus написал:

Я бы попробовал поменять ключики. Нужен на p (country, procount, ingame).

Вот так добавьте ключ.

alter table kz_plrstats add index country__procount__ingame (country, procount, ingame);

Отредактированно deadka (15.12.2011 15:33:13)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 16.12.2011 17:58:56

lexikon
Участник
Зарегистрирован: 14.12.2011
Сообщений: 13

Re: SELECT DISTINCT - 6 секунд

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

Неактивен

 

#9 16.12.2011 22:44:01

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

Re: SELECT DISTINCT - 6 секунд

А EXPLAIN?

Неактивен

 

#10 16.12.2011 23:14:21

lexikon
Участник
Зарегистрирован: 14.12.2011
Сообщений: 13

Re: SELECT DISTINCT - 6 секунд

1    SIMPLE    s    ALL    authid    NULL    NULL    NULL    162665    Using temporary; Using filesort
1    SIMPLE    p    eq_ref    authid,country,country__procount__ingame    authid    194    amxx.s.authid    1    Using where

Неактивен

 

#11 22.12.2011 18:45:35

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

Re: SELECT DISTINCT - 6 секунд

Хм. А так?
SELECT STRAIGHT_JOIN DISTINCT s.name, p.procount, p.mapcount,p.ingame, p.country,p.authid
FROM `kz_plrstats` p JOIN `kz_stats` s ON p.authid=s.authid
WHERE p.country='ru'
ORDER BY p.procount DESC,ingame DESC LIMIT 50

Как-то оно странно выбирает последовательность.

Неактивен

 

Board footer

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