Sending data в процессах MySQL

Ge0SuB

Guest
Sending data в процессах MySQL

Такая ситуация, есть очень большая таблица, из нее переодически необходимо генерировать отчеты, тоесть просто брать строки и писать в файл.
Есть запрос, использует индыксы, все нормально.
Есть код которые выполняет запрос и в цикле записивает строки в файл.
Есть один давольно тормознутый сервак на котором происходит такая штука,
при запуске генерации отчета в процессах mysql появляеться такая запись

__326805 root localhost radius Query 81 Sending data запрос__

и и висит очень долго.
На других сервака где такое делаеться, всё работает быстро.

Вопрос такой, почему в таком статусе,Sending data, ПХП ничего не делает, он что еще не получил никаких данных из mysql и не дошел до цикла которые будет писать строки в код?

Можно ли как-то сделать что-бы данные писались по мере поступления? а не пока пройдет процесс Sending data, а потом только идет цыкл записи?

Спасибо, жду ответа.
 

ForJest

- свежая кровь
Ge0SuB
Если там тяжёлый индекс, то может притормаживать.
Покопай в сторону INSERT DELAYED - в документации
 

Ge0SuB

Guest
Вот такая таблица
PHP:
CREATE TABLE `RadAcctAV` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `NASIPAddress` int(10) unsigned NOT NULL default '0',
  `UserName` varchar(64) NOT NULL default '',
  `CalledStationId` varchar(64) NOT NULL default '',
  `CallingStationId` varchar(64) NOT NULL default '',
  `h323gwId` tinyint(3) unsigned NOT NULL default '0',
  `h323confId1` int(10) unsigned NOT NULL default '0',
  `h323confId2` int(10) unsigned NOT NULL default '0',
  `h323confId4` int(10) unsigned NOT NULL default '0',
  `h323setupTime` timestamp(14) NOT NULL,
  `h323connectTime1` date NOT NULL default '0000-00-00',
  `h323connectTime2` time NOT NULL default '00:00:00',
  `h323disconnectTime` timestamp(14) NOT NULL default '00000000000000',
  `h323disconnectCause` tinyint(3) unsigned NOT NULL default '0',
  `h323voiceQuality` tinyint(3) unsigned NOT NULL default '0',
  `peerId` smallint(5) unsigned NOT NULL default '0',
  `AcctSessionId` int(10) unsigned NOT NULL default '0',
  `AcctInputOctets` int(10) unsigned NOT NULL default '0',
  `AcctOutputOctets` int(10) unsigned NOT NULL default '0',
  `AcctSessionTime` mediumint(8) unsigned NOT NULL default '0',
  `AcctDelayTime` tinyint(3) unsigned NOT NULL default '0',
  `AcctTime` timestamp(14) NOT NULL default '00000000000000',
  `h323remoteAddress` varchar(15) NOT NULL default '',
  `price` float(10,5) unsigned NOT NULL default '0.00000',
  `vPrice` float(10,5) unsigned NOT NULL default '0.00000',
  `connectPrice` float(10,5) unsigned NOT NULL default '0.00000',
  `connectVPrice` float(10,5) unsigned NOT NULL default '0.00000',
  `len` mediumint(8) unsigned NOT NULL default '0',
  `mlen` float(10,5) unsigned NOT NULL default '0.00000',
  `code` varchar(9) NOT NULL default '',
  `euPrice` float(10,5) unsigned NOT NULL default '0.00000',
  `euVPrice` float(10,5) unsigned NOT NULL default '0.00000',
  `euConnectPrice` float(10,5) unsigned NOT NULL default '0.00000',
  `euConnectVPrice` float(10,5) unsigned NOT NULL default '0.00000',
  `euLen` mediumint(8) unsigned NOT NULL default '0',
  `euMlen` float(10,5) unsigned NOT NULL default '0.00000',
  `euCode` varchar(9) NOT NULL default '',
  `codec` varchar(15) NOT NULL default '',
  `prefix` varchar(8) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `peerId` (`peerId`,`AcctTime`),
  KEY `AcctTime` (`AcctTime`)
);
Запрос типа

select id,mlen,price from RadAcctAV force index(AccTime) итд... where acctime >= 200501000000 and acctime <= 200502000000

даже ордер не делаю.

Просто дурдом.. так тормозит..

Хотя там под выборку ( за один месяц ) подподает более 11 милионов записей :)

Помогите, может на постгрес перейти, может он лучше будет справляться ...
Спасибо!
 

Апельсин

Оранжевое создание
> подподает более 11 милионов записей

вы что все эти 11 миллионов записей выбираете и отправляете клиенту?!
 

Ge0SuB

Guest
Они сами себе их выбирают со своей локальной базы.

-~{}~ 26.09.05 19:09:

Автор оригинала: ForJest
это тафтология. Меньше чем и меньше чем. Достаточно одного числа.
Что показывает explain?
Это просто опечатка, на самом деле задаеться перио >= <=


А эксплейн говорит вот это :
PHP:
type = range
possible_keys = AcctTime
key = AcctTime
key_len = 4
Extra = Using where
а вот кусок нормального веара.
where AcctTime >='20020927000000' and AcctTime <= '20020927235959'
 

si

Administrator
Хотя там под выборку ( за один месяц ) подподает более 11 милионов записей
вот он и посылает их все на клиента, а PHP ждет. по пробуй [m]mysql_unbuffered_query[/m]
 

Ge0SuB

Guest
mysql_unbuffered_query

Теперь такой вопрос, при использовании mysql_unbuffered_query
например так
PHP:
$result = mysql_unbuffered_query($query);

while ($res = mysql_fetch_object($result))
{

     echo $res->id."<br>";

}
выводиться только первое значение, и потом начинает ругаться что $result не правельный указатель. и ничего не выводит, может необходимо делать какие-то задержки что-бы unbuffered_query успевал запихивать данные в $result ?
 

fisher

накатила суть
кстати если там памяти можно отожрать и апдейты нечастые то id,mlen,price - можно прям в один индекс... ещё вариант - разнести таблицу на две части - часто читаемую и редко...
 

Ge0SuB

Guest
А чем поможет такй индекс? Ведь в моем запросе только AccTime юудет использоваться проиндексированый и всё. или я не прав?
 

Steamroller

Новичок
А чем поможет такй индекс? Ведь в моем запросе только AccTime юудет использоваться проиндексированый и всё. или я не прав?
Так он будет по каждому значению - делать index lookup и вытаскивать запись. (Т. е. на большом объеме это означает - дергать диск). А если сделать индекс (AcctTime, id, mlen, price) - то это будет последовательное сканирование куска индекса, что значительно быстрее.

Теперь такой вопрос, при использовании mysql_unbuffered_query выводиться только первое значение, и потом начинает ругаться что $result не правельный указатель. и ничего не выводит, может необходимо делать какие-то задержки что-бы unbuffered_query успевал запихивать данные в $result ?
Не должон вроде ругаться, может где-то ещё ошибка, присваивание там где-нибудь, перепутал res и result?
 
Сверху