Performance einer Query
am 04.12.2006 19:56:46 von newsgroupsHallo zusammen,
ich habe ein "kleines" Problem mit der Performance einer Query und bin
mir da nicht ganz im klaren darüber WARUM. Vielleicht kann mir da jemand
von euch weiterhelfen:
Ich habe folgende Indizes auf den Tabellen (abgesehn vom usernamen alles
integer):
*************************** 1. row ***************************
Table: forum_posts
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: postid
Collation: A
Cardinality: 2482108
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
*************************** 2. row ***************************
Table: forum_posts
Non_unique: 1
Key_name: show_posts
Seq_in_index: 1
Column_name: subid
Collation: A
Cardinality: 59097
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
*************************** 3. row ***************************
Table: forum_posts
Non_unique: 1
Key_name: show_posts
Seq_in_index: 2
Column_name: deleted
Collation: A
Cardinality: 68947
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
*************************** 4. row ***************************
Table: forum_posts
Non_unique: 1
Key_name: show_posts
Seq_in_index: 3
Column_name: postid
Collation: A
Cardinality: 2482108
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
und
*************************** 1. row ***************************
Table: users
Non_unique: 0
Key_name: userid
Seq_in_index: 1
Column_name: userid
Collation: A
Cardinality: 236705
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
*************************** 2. row ***************************
Table: users
Non_unique: 1
Key_name: username
Seq_in_index: 1
Column_name: username
Collation: NULL
Cardinality: 236705
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: FULLTEXT
Und es geht um folgende Query:
mysql> explain SELECT a.postid, a.beitrag, a.name, a.userid,
date_format(a.zeit,'%d.%m.%Y um %H:%i') AS zeit,
date_format(a.edited,'%d.%m.%Y um %H:%i') AS edited, b.usersex,
b.forum_beitr, b.p_alter, b.userid FROM forum_posts AS a LEFT JOIN users
AS b ON b.userid = a.userid WHERE (a.subid=2222 AND a.deleted=0) ORDER
BY a.postid LIMIT 5640,15\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref
possible_keys: show_posts
key: show_posts
key_len: 7
ref: const,const
rows: 9157
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: eq_ref
possible_keys: userid
key: userid
key_len: 4
ref: dba1.a.userid
rows: 1
Extra:
Für mich ist nicht nachvollziehbar, wie MySQL auf die 9157 Rows kommt,
denn ein count(*) auf a.subid=2222 (ohne berücksichtigung von deleted)
kommt auf ca. 5500 Zeilen.
Die Query dauert auf die Weise teilweise bis zu 10 Sekunden.
Irgendwelche Ideen, Vorschläge oder Tipps?
Danke schonmal
Claus