alpine
Новичок
its depends ofугу, т.е. ваши запросы с временной таблицей медленнее предложенного мной с той же временной таблицей. при том что в случае с одним запросом исключается время на передачу данных. нюню...
its depends ofугу, т.е. ваши запросы с временной таблицей медленнее предложенного мной с той же временной таблицей. при том что в случае с одним запросом исключается время на передачу данных. нюню...
Ага, - from(или on вместо of)
mysql> SELECT VERSION();
+---------------------+
| VERSION() |
+---------------------+
| 5.0.21-community-nt |
+---------------------+
1 row in set (0.02 sec)
mysql> SELECT COUNT(*) FROM categories;
+----------+
| COUNT(*) |
+----------+
| 4518 |
+----------+
1 row in set (0.02 sec)
mysql> SELECT COUNT(*) FROM models;
+----------+
| COUNT(*) |
+----------+
| 184810 |
+----------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT categories_id, COUNT(*) as cnt FROM `models`GROUP BY categories_id ORDER BY cnt DESC LIMIT 3;
+----+-------------+--------+-------+---------------+------------+---------+------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+------------+---------+------+--------+----------------------------------------------+
| 1 | SIMPLE | models | index | NULL | categories | 4 | NULL | 184810 | Using index; Using temporary; Using filesort |
+----+-------------+--------+-------+---------------+------------+---------+------+--------+----------------------------------------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT * FROM categories WHERE categories_id IN (1849,142,168);
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | categories | range | PRIMARY | PRIMARY | 4 | NULL | 3 | Using where |
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT c . * , COUNT( * ) AS cnt
FROM `models` AS m INNER JOIN categories AS c ON ( m.categories_id = c.categories_id )
GROUP BY m.categories_id ORDER BY cnt DESC LIMIT 3;
+----+-------------+-------+------+---------------+------------+---------+----------------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------------+---------+----------------------------+------+---------------------------------+
| 1 | SIMPLE | c | ALL | PRIMARY | NULL | NULL | NULL | 4518 | Using temporary; Using filesort |
| 1 | SIMPLE | m | ref | categories | categories | 4 | metamarket.c.categories_id | 79 | Using where; Using index |
+----+-------------+-------+------+---------------+------------+---------+----------------------------+------+---------------------------------+
2 rows in set (0.00 sec)
В наличии есть такие таблицы:
mysql> SHOW CREATE TABLE categories;
CREATE TABLE `categories` (
`categories_id` int(10) unsigned NOT NULL auto_increment,
`parent_id` int(11) NOT NULL default '0',
`image_size` int(11) NOT NULL default '2',
`leftcat` int(11) NOT NULL default '0',
`rightcat` int(11) NOT NULL default '0',
`rootid` int(11) NOT NULL default '0',
`level` int(11) NOT NULL default '0',
`title` varchar(255) NOT NULL default '',
`syn_id` int(11) NOT NULL default '0',
`template` varchar(255) NOT NULL default 'type vendor - name',
`kolitem` int(11) NOT NULL default '0',
`priority` int(10) unsigned NOT NULL default '0',
`subnum` int(10) unsigned default '0',
PRIMARY KEY (`categories_id`),
KEY `cat` (`leftcat`,`rightcat`),
KEY `rightcat` (`rightcat`),
KEY `parent` (`parent_id`),
KEY `leftcat` (`leftcat`),
KEY `item` (`kolitem`),
KEY `level` (`level`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
mysql> SHOW CREATE TABLE models;
CREATE TABLE `models` (
`model_id` int(10) unsigned NOT NULL auto_increment,
`products_id` int(11) default NULL,
`vendor_id` int(11) NOT NULL default '0',
`categories_id` int(11) NOT NULL default '0',
`model_name` varchar(255) NOT NULL default '',
`picture` text NOT NULL,
PRIMARY KEY (`model_id`),
KEY `model_name` (`model_name`),
KEY `vendor` (`vendor_id`),
KEY `categories` (`categories_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
<?php
include './time.inc.php';
mysql_connect('localhost', 'test', 'test');
mysql_select_db('metamarket');
$num_iterations = 10;
for ( $i=0; $i<$num_iterations; $i++ ) {
timestart('Test 2 query');
$sSQL = 'SELECT categories_id, COUNT(*) as cnt
FROM `models`
GROUP BY categories_id
ORDER BY cnt DESC
LIMIT 3 ';
// echo $sSQL.'<br />';
$rRes = mysql_query($sSQL);
$aCategoriesIds = array();
while ( $aRow = mysql_fetch_row($rRes) ) {
$aCategoriesIds[] = $aRow[0];
}
$sSQL = 'SELECT *
FROM categories
WHERE categories_id
IN ('.implode(',', $aCategoriesIds).')';
// echo $sSQL.'<br />';
$rRes = mysql_query($sSQL);
$aCategories = array();
while ( $aRow = mysql_fetch_row($rRes) ) {
$aCategories[] = $aRow;
}
timestop('Test 2 query');
}
for ( $i=0; $i<$num_iterations; $i++ ) {
timestart('Test 1 query');
$sSQL = 'SELECT c . * , COUNT( * ) AS cnt
FROM `models` AS m
INNER JOIN categories AS c ON ( m.categories_id = c.categories_id )
GROUP BY m.categories_id
ORDER BY cnt DESC
LIMIT 3';
// echo $sSQL.'<br />';
$rRes = mysql_query($sSQL);
$aCategories = array();
while ( $aRow = mysql_fetch_row($rRes) ) {
$aCategories[] = $aRow;
}
timestop('Test 1 query');
}
// print_r($aCategories);
timeprint();
?>
счетчик кол-во вызовов общее сpеднее
Test 2 query 10 1.1624 0.1162
Test 1 query 10 4.4241 0.4424
вся пpогpамма pаботала 5.6119 сек
все внутpенные вызовы заняли 5.5866 сек (20 pаз)
остаток вpемени 0.0254 сек
а если сначала выполнить цикл "Test 1 query", а уже потом "Test 2 query" ?
Test 1 query 10 4.3218 0.4322
Test 2 query 10 1.1389 0.1139
Если в браузере нажать два-три раза ctrl+F5 устроит?Также хотелось бы увидеть результаты 2-3 запусков данного теста.
Test 1 query 10 4.3356 0.4336
Test 2 query 10 1.1346 0.1135
Test 1 query 10 4.3083 0.4308
Test 2 query 10 1.1426 0.1143
Test 1 query 10 4.3200 0.4320
Test 2 query 10 1.1457 0.1146
mysql> EXPLAIN SELECT c . *
-> FROM (SELECT categories_id, COUNT(*) as cnt
-> FROM `models`
-> GROUP BY categories_id
-> ORDER BY cnt DESC
-> LIMIT 3) AS m
-> , categories AS c
-> WHERE m.categories_id = c.categories_id;
+----+-------------+------------+--------+---------------+------------+---------+-----------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+------------+---------+-----------------+--------+----------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 3 | |
| 1 | PRIMARY | c | eq_ref | PRIMARY | PRIMARY | 4 | m.categories_id | 1 | Using where |
| 2 | DERIVED | models | index | NULL | categories | 4 | NULL | 184810 | Using index; Using temporary; Usingfilesort |
+----+-------------+------------+--------+---------------+------------+---------+-----------------+--------+----------------------------------------------+
3 rows in set (0.11 sec)
for ( $i=0; $i<$num_iterations; $i++ ) {
timestart('Test 3 using subquery');
$sSQL = 'SELECT c . *
FROM (SELECT categories_id, COUNT(*) as cnt
FROM `models`
GROUP BY categories_id
ORDER BY cnt DESC
LIMIT 3) AS m
, categories AS c
WHERE m.categories_id = c.categories_id';
// echo $sSQL.'<br />';
$rRes = mysql_query($sSQL);
$aCategories = array();
while ( $aRow = mysql_fetch_row($rRes) ) {
$aCategories[] = $aRow;
}
timestop('Test 3 using subquery');
}
счетчик вызовов общее сpеднее
Test 1 query 10 4.6128 0.4613
Test 2 query 10 1.1505 0.1150
Test 3 using subquery 10 1.1379 0.1138
вся пpогpамма pаботала 6.9062 сек
все внутpенные вызовы заняли 6.9011 сек (30 pаз)
остаток вpемени 0.0051 сек
т.е. получается, что при INNER JOIN для кажой строке из 4518 анализируется 79 из другой таблицы? т.е. 4518 * 79 = 356 922 строк? или я ошибаюсь... тогда почему такая разница во времени выполнения?
mysql> EXPLAIN SELECT c . * , COUNT( * ) AS cnt
FROM `models` AS m INNER JOIN categories AS c ON ( m.categories_id = c.categories_id )
GROUP BY m.categories_id ORDER BY cnt DESC LIMIT 3;
+----+-------------+-------+------+---------------+------------+---------+----------------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------------+---------+----------------------------+------+---------------------------------+
| 1 | SIMPLE | c | ALL | PRIMARY | NULL | NULL | NULL | 4518 | Using temporary; Using filesort |
| 1 | SIMPLE | m | ref | categories | categories | 4 | metamarket.c.categories_id | 79 | Using where; Using index |
+----+-------------+-------+------+---------------+------------+---------+----------------------------+------+---------------------------------+
2 rows in set (0.00 sec)
В наличии есть такие таблицы:
Не смущает.ответь честно, тебя не смущает что условие объединения не использует индекс????
Угу, ждем теперь ваши запросы и ваши тесты с работающими индексами.очень ждём результаты запросов с работающими индексами
предложите запрос(или рекомендации по созданию индексов)
OPTIMIZE TABLE `models`;(оптимайз или аналайз)