Thread SQL_CALC_FOUND_ROWS() (18 answers)
Opened by Froschpopo at 2007-05-13 21:14

Froschpopo
 2007-05-13 21:14
#35469 #35469
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich mal wieder mit Problemen
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    SQL_CALC_FOUND_ROWS
    a.id,
    a.name,
    a.birthday,
    b.id

FROM defaultusers AS a

LEFT JOIN photos AS b ON
    b.id = (SELECT MAX(id) FROM photos WHERE user_id = a.id)

WHERE
    a.status = 'N' and
    a.sex = 'w'

ORDER BY a.lastlogin DESC
LIMIT 0, 10;


Das Problem: ohne SQL_CALC_FOUND_ROWS() dauert die Abfrage 0.13 Sekunden und das bei über 400.000 Bildern (LongBlob) in "photos". Es ist also eine richtig große Datenbank.
Aber sobald ich SQL_CALC_FOUND_ROWS() einsetze, dauert die Abfrage bis zu 16 Sekunden!
Es muss etwas mit dem JOIN zu tun haben, denn ohne JOIN ist SQL_CALC_FOUND_ROWS() extrem schnell.
Das komische ist aber, dass ohne SQL_CALC_FOUND_ROWS() der JOIN sehr schnell ist!
Woran bin ich denn nun?

Das sagt EXPLAIN:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
+----+--------------------+--------+--------+---------------+------------+---------+------

------+-------+-----------------------------+
| id | select_type        | table  | type   | possible_keys | key        | key_len | ref        | rows  | Extra                       |
+----+--------------------+--------+--------+---------------+------------+---------+------

------+-------+-----------------------------+
|  1 | PRIMARY            | a      | ALL    | NULL          | NULL       |    NULL | NULL       | 20531 | Using where; Using filesort |
|  1 | PRIMARY            | b      | eq_ref | PRIMARY       | PRIMARY    |       4 | func       |     1 | Using index                 |
|  2 | DEPENDENT SUBQUERY | photos | ref    | usernummer    | usernummer |       3 | users.a.id |     2 |                             |
+----+--------------------+--------+--------+---------------+------------+---------+------

------+-------+-----------------------------+
3 rows in set (0.00 sec)

Wie man sieht sind INDEX's vorhanden.\n\n

<!--EDIT|Froschpopo|1179076756-->

View full thread SQL_CALC_FOUND_ROWS()