Как получить результат запроса и кол-во строк запроса Одновременно?

psixojoker

Есть HighLoad - таблица около 10 млн. записей +/- 1млн.С ней работает много народу одновременно.Имеются хранимая функция (math), в которой идет жесткая математика(подсчеты сумм столбцов, синусы, тангенсы, логарифмы и прочая лабуда - смысл в том, что функция тяжелая).В моем запросе участвует эта функция.Мне надо получить результат запроса, и кол-во записей.Чтобы это реализовать, мне приходится 2 раза выполнять один и тот же запрос.select count(*) from t where math(id,par1,par2,...)>1;select * from t where math(id,par1,par2,...)>1;Что при таком объеме таблицы и нагрузки является бредом.Я хочу записать в переменную результат, но естественно это не работает: select *, count(*) into @a from t where math(id,par1,par2,...)>1;Как это решать?
15 ответов

psixojoker

посчитать количество записей в резалтсете?


psixojoker

Еще вариант - SQL_CALC_FOUND_ROWS + FOUND_ROWS()


psixojoker

А хотя нет, без LIMIT-а в SQL_CALC_FOUND_ROWS нет необходимости.


psixojoker

Сдается мне, ТС имел в виду выполнить единым запросом в консоли mysql. Т.к. клиент и так узнает число строк - либо по окончанию выборки строк при use_result, либо сразу после выполнения запроса при store_result.


psixojoker

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


psixojoker

psixojoker,может за счет временной таблицы?


psixojoker

psixojoker,Какое API использует ваша программа?


psixojoker

посчитать количество записей в резалтсете?
да.
Не похоже, не согласуется с Иногда, особенно в плохо спроектированных программах, требуется знать количество строк до начала фетча. Например, чтобы выделить память нужного размера.
нам надо получить одновременно и результат запроса, и кол-во записей этого же запроса.(любым способом)фактически, я должен выполнить 2 почти равнозначных запроса, что не рационально с точки зрения ресурсов.а когда у меня висит одновременно 1000 клиентов - то.... сами понимаете.(((
psixojoker,может за счет временной таблицы?
всмысле ? по-шустрому загонять в MEMORY?
psixojoker,Какое API использует ваша программа?
php pdo


psixojoker

psixojoker,Ты в PHP (внимательно!) выполняешь запрос и получаешь (очень внимательно!) результат!Объясни популярно, зачем еще раз выполнять запрос, чтобы узнать, сколько строк в результате, кторый ты ДЕРЖИШЬ В РУКАХ?!


psixojoker

Дико извиняюсь, если что не правильно понял... Если ж правильно, то даже не знаю как пояснить. Как-то так:- Привет! Дай мне вот эту кучку яблок.- На.- Спсасибо! А у тебя нет ЕЩЕ ОДНОЙ ТАКОЙЙ ЖЕ кучки?- Зачем?- Ну посчитай, сколько их там, чтобы я знал, сколько у меня яблок...


psixojoker

Edd.Dragon, это я наверно криво объяснил))точнее недообъяснил.все эти запросы - выполняются в хранимой процедуре(не той, которая math).и в зависимости от результата запроса(count(*)) я дальше выстраиваю логику процедуры.именно поэтому в php ещё ничего не попадает(пока на серваке выполняется процедура).


psixojoker

А, Семен Семеныч! )))Я, честно говоря, на вскидку не помню, если возможность получить кол-во строк последнего запроса, но как-минимум два варианта обхода проблемы есть:- результат запроса класть во временную таблицу;- включить кеширование запросов и обеспечить условия, при которых уже выполненный твой мегазапрос не выбросится из кеша (например, из-за изменения в таблицах, по которым он отработал или из-за очень быстрого перезаполнения кеша).


psixojoker

я чё-то не понял, а почему вариант miksofta с found_rows() не подходит...
SQL_CALC_FOUND_ROWS and FOUND_ROWS() can be useful in situations when you want to restrict the number of rows that a query returns, but also determine the number of rows in the full result set without running the query again. An example is a Web script that presents a paged display containing links to the pages that show other sections of a search result. Using FOUND_ROWS() enables you to determine how many other pages are needed for the rest of the result.


psixojoker

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


psixojoker

Мб
set @a=0;
select * from t where math(id,par1,par2,...)>1 and (select @a:=@a+1);
?