Тут я сделал.. некоторые выкладки.. в виде небольших тестов.
В качестве пример взял две таблицы со структурой подходящим к твоим таблицы d1,d2.
CREATE TABLE dN (
id int(11) NOT NULL auto_increment,
name char(20) NOT NULL default '',
uq_field bigint(20) NOT NULL default '0',
note char(250) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
d1 данные 9,935 кБ индекс 296,960 Байт (35,949 записей)
d2 данные 10,025 кБ индекс 299,008 Байт (36,273 записей)
Итак.
1. Просто выборка из базы.. запрос за запросом. - 101 запрос.
PHP:
$qbase="SELECT d1.id,d1.name, d2.id , d2.name
FROM d1 d1 INNER JOIN d2 d2 ON d1.id=d2.id
WHERE d1.id<10000";
$res=mysql_query($qbase);
echo "Total - ".mysql_num_rows($res)." records<br>\n";
for($i=0;$i<100;$i++)
{
$qadd=" AND d1.id<5000";
$res=mysql_query($qbase.$qadd);
echo "Total - in query qbase - ".$qadd." - ".mysql_num_rows($res)." records<br>\n";
}
Output :
Total - 2490 records
Total - in query qbase - AND d1.id<5000 - 1244 records
.....
.....
вся пpогpамма pаботала 15.0083 сек
PHP:
$cache=array();
$cache_add=array();
function cachesql($query)
{
static $sbase=0;
global $cache;
global $cache_add;
// Определяем схожий источник данных sbase.
// Упрощая тест, полагаем, что первым запросом идет именно он.
if ($sbase==0)
{
$res=mysql_query($query);
$i=0;
while($row=mysql_fetch_row($res))
{
$cache[$i++]=$row;
}
$sbase++;
return $cache;
}//if
else
{
// Здесь будет проводиться синтаксический разбор.
// Для упрощения - мы его опускаем.
$res=array();
for($i=0,$c=sizeof($cache);$i<$c;$i++)
{
if($cache[$i][0]<5000)
$cache_add[$i]=$cache[$i];
}
$sadd++;
return $cache_add;
}//else
}//f cachesql
$qbase="SELECT d1.id,d1.name, d2.id , d2.name FROM d1 d1 INNER JOIN d2 d2 ON d1.id=d2.id WHERE d1.id<10000";
$res=cachesql($qbase);
echo "Total - in query qbase - ".$qadd." - ".sizeof($res)."records <br>\n";
for($i=0;$i<100;$i++)
{
$qadd=" AND d1.id>5000";
$res=cachesql($qbase.$qadd);
echo "Total - in query qbase - ".$qadd." - ".sizeof($res)." records<br>\n";
}
Output:
Total - in query qbase - - 2490 records
Total - in query qbase - AND d1.id<5000 - 1244 records
вся пpогpамма pаботала 5.3017 сек
Соотвественно. Приведу результаты для других типов запросов.
--------------------------------------------------------------
Total - 2490
Total - in query qbase - AND MOD(d1.id,2)=0 - 1233
вся пpогpамма pаботала 20.2367 сек
Total - in query qbase - - 2490records
Total - in query qbase - AND d1.id>5000 - 1233 records
вся пpогpамма pаботала 5.6057 сек
--------------------------------------------------------------
--------------------------------------------------------------
PHP:
LOCATE('а',d1.name)>0 (и это без индекса по полю name)
Total - 2490 records
Total - in query qbase - AND LOCATE('а',d1.name)>0 - 1178 records
вся пpогpамма pаботала 20.2786 сек
PHP:
strpos($cache[$i][1],'а')!==FALSE
Total - in query qbase - - 2490records
Total - in query qbase - LOCATE('а',d1.name)>0 - 1178 records
вся пpогpамма pаботала 10.1678 сек
--------------------------------------------------------------
Краткие итоги.
В принципе ускорение выполнения запросов в несколько раз можно назвать приемлемым результатом.
Однако если просто делать return из функции без какого либо разбора выражения то вариант с кэшем выполняется меньше секунды.. оно и понятно он же ничего не делает.
Лично мое мнение писать "разбор запроса" - не стоит оно того. А вдвойне не стоит делать это на пхп.
Изобретать SQL оно тебе надо?
Вот если запросы очень часто повторяются, то как выход написать экстеншин к пхп (реализацию класса Crazy на c
.
И без всякого разбора производительность возрастет.
Если честно мне немного непонятно поведение мускла - абсолютно никакого кэширования
Если не ошибаюсь это обещали поправить. вроде с 4.1. будет кэширование запросов