2012-01-09 3 views
1

У меня есть две таблицы базы данных, одна из которых содержит 165 записей. Для каждого из них мне нужно было просмотреть таблицу с 1 миллионом и посмотреть, сколько раз упоминается каждая из этих 165 записей.Подсчет количества результатов из большой базы данных

«odds_provider» имеет 165 записей, «bettingoffer» имеет миллион записей.

$SQL = "SELECT 
    odds_provider.id AS id, 
    odds_provider.name AS name, 
    COUNT(bettingoffer.odds_providerFK) AS betcount 
    FROM odds_provider 
    INNER JOIN 
    bettingoffer 
    ON bettingoffer.odds_providerFK = odds_provider.id 
    WHERE 
    odds_provider.active = 'yes' 
    GROUP BY 
    odds_provider.id, 
    odds_provider.name 
    ORDER BY betcount DESC"; 

    $result = mysql_query($SQL); 
    while ($db_field = mysql_fetch_assoc($result)) { 
echo $db_field['id'] , " " , $db_field['name'] , " " , $db_field['betcount'] , "</BR>"; 
    }   

Это делает то, что предназначено, но требуется навсегда. Есть ли более быстрый способ?

+0

Какие индексы у вас есть на 2 столах? Можете ли вы попробовать в приглашении MySQL (или через PHPMyAdmin и сообщить нам вывод «EXPLAIN SELECT ...»? –

+0

, сколько различных odds_providerFK находится в таблице ставок, есть ли много неактивных? – newtover

+0

395 всего, 166 активных. –

ответ

1

Это должно быть быстрее, особенно если не так много неактивных идентификаторов.

SELECT id, name, betcount 
FROM (
    SELECT 
    odds_providerFK as id, 
    COUNT(*) as betcount 
    FROM bettingoffer 
    WHERE active = 'yes' 
    GROUP BY odds_providerFK 
    ORDER BY betcount DESC) as counts 
USING (id); 
0

Вы можете сделать это гораздо лучше, используя запросы SQL Join. Вам не нужно искать вторую таблицу для каждой отдельной записи в 1-й таблице. Вы можете установить связь JOIN между таблицами.

Было бы более полезно, если бы вы вставили определение схемы обеих ваших таблиц, но в общем случае это работает с запросами JOIN.

Просьба сообщить refer to these tutorials о том, как работают JOIN-запросы.

+0

INNER JOIN не проблема, я знаю, как это сделать. Проблема заключается в получении подсчитанных результатов в виде массива. Это будет код для соединения: INNER JOIN bettingoffer ON bettingoffer.odds_providerFK = odds_provider.id –

+0

Какова ваша цель? вы хотите найти, сколько записей в вашей 2-й таблице для каждой записи в вашей 1-й таблице? –

+0

тип JOIN, который вы должны использовать, будет зависеть от вашей цели. –

1

Вы должны иметь возможность присоединиться к двум таблицам с помощью SQL. Было бы лучше не делать COUNT (*). Вы можете получить более высокую производительность, указав конкретный столбец, который вы хотите подсчитать.

SELECT 
    op.id, 
    op.name, 
    COUNT(bo.odds_providerFK) AS bet_offering_count 
FROM 
odds_provider op 
INNER JOIN 
bettingoffer bo 
    ON bo.odds_providerFK = op.id 
WHERE 
    op.active = 'yes' 
GROUP BY 
    op.id, 
    op.name 
+0

У меня уже есть медленное решение, и это еще медленнее. –

+0

На самом деле, в MYSQL 'COUNT (*)' обычно быстрее, чем 'COUNT (column)'. –

+2

COUNT (*) будет намного быстрее для таблиц MyISAM, поскольку он кэширует количество столбцов. Таблицы InnoDB не кэшируют количество строк, поэтому COUNT (*) будет медленнее. – Travis

Смежные вопросы