1 up | 2 up | 3 up | 4 up | 5 up | 6 up | 7 up |
^^^ Additional posts ^^^
zorg.ch
#31357 by @ 05.05.2004 10:09 - nach oben -
Waer mal soweit vorbereitet. InnoDB initialisieren kann er nur mit nem neustart des Daemons, -> ~2-3 Minuten Downtime. Wenns euch recht ist, kann man jetzt machen, sonst mach ichs heute Abend.
zorg.ch
#31361 by @ 05.05.2004 10:53 - nach oben -
Query Cache

Hilft natuerlich nichts gegen inserts.
zorg.ch
#31372 by @ 05.05.2004 11:51 - nach oben -
Mit Query Cache:


# siege -u "http://www.zooomclan.org/forum.php"
** Siege 2.09
** Preparing 10 concurrent users for battle.
The server is now under siege...done
Transactions: 299 hits
Elapsed time: 60.19 secs
Data transferred: 5751526 bytes
Response time: 0.97 secs
Transaction rate: 4.97 trans/sec
Throughput: 95556.17 bytes/sec
Concurrency: 4.84
Successful transactions: 299
Failed transactions: 0



mysql> show status like "Qcache%";
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_queries_in_cache | 173 |
| Qcache_inserts | 339 |
| Qcache_hits | 46190 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 315 |
| Qcache_free_memory | 16379336 |
| Qcache_free_blocks | 9 |
| Qcache_total_blocks | 360 |
+-------------------------+----------+
8 rows in set (0.00 sec)


Von 0.5 Trans/s auf 5 Trans/s.

InnoDB Support ist nun auch aktiviert, muesste man also mal ausprobieren.
zorg.ch
#31373 by @ 05.05.2004 11:54 - nach oben -
Slow Query Logging spuckt ab zu dieses Query aus:


# User@Host: zooomclan[zooomclan] @ localhost []
# Query_time: 18 Lock_time: 0 Rows_sent: 23 Rows_examined: 94517
SELECT user.clan_tag, user.username, c2.*, UNIX_TIMESTAMP(c1.date) as date, count(c1.id) as replies from comments as c2
left join comments as c1 on c1.id = c2.thread_id and c1.board = c2.board
left join user on c2.user_id = user.id group by c1.thread_id order by lastpost desc limit 0,23;


Dieses Query ist nicht indexed, d.h. er macht einen full table scan.
zorg.ch
#31387 by @ 05.05.2004 14:25 - nach oben -
merci, ich schau den mal an...
zorg.ch
#31417 by @ 05.05.2004 21:04 - nach oben -

mysql$ explain SELECT user.clan_tag, user.username, c2.*, UNIX_TIMESTAMP(c1.date) as date, count(c1.id) as replies from comments as c2
->
-> left join comments as c1 on c1.id = c2.thread_id and c1.board = c2.board
->
-> left join user on c2.user_id = user.id group by c1.thread_id order by lastpost desc limit 0,23;
+-------+--------+---------------+---------+---------+--------------+-------+---------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+--------+---------------+---------+---------+--------------+-------+---------------------------------+
| c2 | ALL | NULL | NULL | NULL | NULL | 31042 | Using temporary; Using filesort |
| c1 | eq_ref | PRIMARY,board | PRIMARY | 4 | c2.thread_id | 1 | |
| user | eq_ref | PRIMARY | PRIMARY | 4 | c2.user_id | 1 | |
+-------+--------+---------------+---------+---------+--------------+-------+---------------------------------+
3 rows in set (0.00 sec)

zorg.ch
#31481 by @ 06.05.2004 15:31 - nach oben -
das heisst dass er für c2 keinen Index hat?
da müsste ich so einen machen: (thread_id, board) ?
zorg.ch
#31487 by @ 06.05.2004 15:59 - nach oben -
Er macht, on disk (in /tmp, um genau zu sein) eine temporaere Tabelle. Kopiert den *GESAMTEN* Inhalt der comments Table da rein. Macht dann einen Fulltable-Scan auf diese temporaere Tabelle, und gibt irgendwann dann mal ein Resultat aus.

/tmp ist gluecklicherweise seit langem schon eine Ramdisk, sonst wuerde ein Query *wesentlich* laenger als ne Sekunde dauern.

Ich versteh allerdings nicht wirklich was du mit diesem Query erreichen willst, allerdings fuehrt er das nach Query-Log pro Pagehit aus ;)
zorg.ch
#31492 by @ 06.05.2004 16:22 - nach oben -
Weiss nicht mehr genau... ich glaube das mach ich, damit ich die Threads in der Forum-Übersicht nach deren Lastposts sortieren kann.
zorg.ch
#31496 by @ 06.05.2004 17:07 - nach oben -
Ich koennte die table mal kopieren, und schauen wie man das schneller machen kann.
zorg.ch
#31503 by @ 06.05.2004 19:02 - nach oben -
Dass er ne temp table macht scheint logisch... die Tabelle comments kommt 2x drin vor...
aber den filesort check ich nicht...
Hab jetzt nämlich 2 indexes gemacht: thread_id, board, lastpost und id, board, lastpost...
Additional posts
zorg.ch
#31388 by @ 05.05.2004 14:26 - nach oben -
Query-Cache hast du jetzt eingestellt? Cool!
zorg.ch
#31414 by @ 05.05.2004 19:58 - nach oben -
Ja. Der bringt bei zooomclan.org zwar schon ziemlich was, aber bei den restlichen Kunden bringt er wesentlich mehr.

InnoDB muesst man mal ausprobieren.
zorg.ch
#31415 by @ 05.05.2004 20:03 - nach oben -
Vielleicht mal so noch ein paar Informationen:


| Com_replace | 99913 |
| Com_select | 64630 |
| Com_update | 1318 |
| Questions | 344739 |
| Qcache_queries_in_cache | 1091 |
| Qcache_inserts | 61502 |
| Qcache_hits | 173579 |
| Slow_queries | 32 |
| Sort_rows | 3482813 |
| Sort_scan | 3932 |
| Table_locks_immediate | 171790 |
| Table_locks_waited | 35 |


Com_replace und Com_update werden von UPDATE Statements ausgelloest. Da gibts irgendwelche Unterschiede. Com_select sind SELECT Statements, welche *NICHT* vom Query Cache behandelt wurden. Qcache inserts sind Querys die in den Qcache kamen, Qcache queries in cache ist die Anzahl Queries die derzeit im Query Cache sind.

Man sieht also, das sehr viel in die DB geschrieben wird, was dann natuerlich den Querycache ungueltig macht. Qcache hits sind die anzahl Queries die aus dem Cache beantwortet wurden. 170000/340000, also knapp die Haelfte. Das ist ja schonmal nicht schlecht. Slow queries sind Queries die laenger als 2s gedauert haben. Sort_scan ist die Anzahl full table scans -> Queries die keine Indices benutzen.
zorg.ch
#31365 by @ 05.05.2004 11:13 - nach oben -
Das "acquire write lock " - Zeug geht nur mit innodb? Ja, das wär cool...
zorg.ch
#31367 by @ 05.05.2004 11:25 - nach oben -
Es geht darum dass bei ner Transaktion die inserts in einem rutsch gemacht werden und darum nicht für jeden einzelnen ein write lock gerupft werden muss.
zorg.ch
#31376 by @ 05.05.2004 12:30 - nach oben -
So wie ich das sehe, bringt das ganze ja nur was, wenn man alle Posts als gelesen Markieren will.

Ich denke der grösste aufwand ist das Rekursive suchen der Posts oder wie seht ihr das?
Also müsste man nach lösungen suchen, wie man das beschleunigen könnte.

Werdeb Stored Procedures in MySQL 4.x schon unterstützt? Dan könnte man eine Prozedur basteln, welche die ID's ausspukt und anschliessend noch die ID's lesen.
zorg.ch
#31377 by @ 05.05.2004 12:35 - nach oben -
Nein, Stored Procedures kann erst der 5er.

Aber die von milamber angesprochenen Subquerys kann der 4er (Doku).
zorg.ch
#31386 by @ 05.05.2004 14:24 - nach oben -
MySQL 4.1 ja... ich hab kürzlich mal ne 4.0XX genutzt... hat zorg schon die 4.1er?
zorg.ch
#31413 by @ 05.05.2004 19:55 - nach oben -
Nein, aber das Testsystem hat 4.1.1, deswegen bin ich drauf reingefallen. Mein Fehler.
zorg.ch
#31418 by @ 05.05.2004 21:08 - nach oben -
Aus den Docs:

If you are inserting many rows from the same client at the same time, use INSERT statements with multiple VALUES lists to insert several rows at a time. This is much faster (many times faster in some cases) than using separate single-row INSERT statements. If you are adding data to a non-empty table, you may tune up the bulk_insert_buffer_size variable to make it even faster. See section 5.2.3 Server System Variables.

Siehe http://dev.mysql.com/doc/mysql/en/Insert_speed.html

Auch Interessant:

http://dev.mysql.com/doc/mysql/en/Update_speed.html
http://dev.mysql.com/doc/mysql/en/Tips.html
zorg.ch
#31477 by @ 06.05.2004 15:22 - nach oben -
gracias, das ist sehr nützlich...
leider fehlt mir mom. ein bisschen Zeit zum Zorg-Coden, aber ich werd dann schon mal schauen.
zorg.ch
#31488 by @ 06.05.2004 16:00 - nach oben -
Zeit hat man nicht, die muss man sich nehmen.
zorg.ch
#31490 by @ 06.05.2004 16:20 - nach oben -
So isches. Und ich nehm sie mir in nächster Zeit für anderes als Zorg-Coden.
zorg.ch
#31389 by @ 05.05.2004 14:27 - nach oben -
naja, das ist glaub wirklich nur beim "mark all as read", aber ich könnte mich täuschen.
zorg.ch
#31369 by @ 05.05.2004 11:27 - nach oben -
Hast Du aber mal untersucht ob dann nicht durch InnoDB das ganze noch wurstliger wird? ich kenne keine Performancevergleichen zwischen den verschiedenen Table Typen, aber könnt ja sein..
zorg.ch
#31370 by @ 05.05.2004 11:32 - nach oben -
MyISAM ist nur beim lesen schnell, bei Schreibvorgaengen verlierts so ziemlich all seine Vorteile.