2010-03-03 8 views
3

У меня сложный запрос MySQL, который занимает много времени, выбирая из таблицы с более чем 150 тыс. Строк и нескольких JOINS и подзапросов. Я ограничиваю количество результатов, но мне нужно знать общее количество строк.MySQL подсчитывает общее количество строк

Есть ли способ не повторять запрос с COUNT(*) как поле для их получения? (повторение запроса почти удваивает количество времени, которое должен выполнить скрипт)

ответ

2

Это может быть на самом деле быстрее сделать два запроса (так что вы можете просто хотите сделать несколько быстрых испытаний):

В любом случае, постарайтесь, чтобы убедиться, что COUNT (*) может использовать индекс (он скажет «используя индекс» в столбце «Дополнительно», если вы используете запрос EXPLAIN)

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

3

У MySQL есть предложение под названием SQL_CALC_FOUND_ROWS, которое вы ставите после SELECT и перед любыми именами полей. Затем вы вызываете второй запрос, который равен SELECT FOUND_ROWS() AS rows, и он дает вам, сколько строк было найдено в предыдущем запросе.

+0

Дополнительная информация по этому вопросу: http://dev.mysql.com/doc/refman/4.1/en/information-functions.html#function_found-rows – cmptrgeekken