2016-07-25 8 views
0

Ich habe eine Website für Biochemie-Forscher erstellt, die es Benutzern ermöglicht, bestimmte Gene abzufragen und verschiedene Statistiken zwischen verschiedenen Gengruppen zu berechnen.MYSQL Read-only DB in Speicheroptimierung

Die MySQL DB ist 16GB und schreibgeschützt (unser Labor hat diese neuen Daten generiert und die Website ist ein Portal, um diese Daten anzuzeigen). Ich habe die Website getestet und festgestellt, dass die DB-Abfrage der langsamste Teil der App ist. Ich möchte die gesamte DB in den Speicher legen, aber lief mit den allgemein akzeptierten Lösungen einige Probleme:

Ich habe einen 8-Core-32GB-Server für den Einsatz.

Option 1: set ENGINE = MEMORY

Einige Spalten sind vom Typ mediumtext und die 64K-Zeilengrenze überschreitet und sich weigern 2 der PUT in MEMORY ENGINE

Option werden: Erhöhung innodb_buffer_pool_size

Dies scheint nicht wirklich die Daten in den Speicher zu legen. Ich überprüfte den verwendeten Pufferpool unter Verwendung der beschriebenen Techniken (https://dba.stackexchange.com/questions/27328/how-large-should-be-mysql-innodb-buffer-pool-size), sehe jedoch nur ~ 100 MB des verwendeten Pufferpools. Die innodb_buffer_pool_size ist korrekt auf 24 GB eingestellt.

Option 3: ein RAM-Disk erstellen und die DB setzt dort dies wie eine gute Option scheint nicht auf ein paar SO Beiträge basieren.

Wie soll ich fortfahren? Bitte beraten.

+0

Wenn jede Abfrage in Ordnung ist? Verwenden Sie alle Abfragen einen optimalen Index? können Sie etwas mehr über die Tabellen und Zeilen sagen –

+0

Der Puffer wird nur im Laufe der Zeit gefüllt, während die db verwendet wird. Hast du es tatsächlich eine Weile unter wechselnder Last laufen lassen? –

+0

Der Pufferpool wird nicht gefüllt, wenn Sie die Daten, mit denen Sie arbeiten, nicht * verwenden *. Sobald Sie es verwenden, liest MySQL es von der Festplatte und fügt es dem Pufferpool (RAM) hinzu, so dass Sie das nächste Mal damit umgehen - es ist da. Es gibt einen Trick, mit dem Sie den Pufferpool vorab laden können, indem Sie eine temporäre Blackholetabelle erstellen und sie mit Daten laden: CREATE TEMPORARY TABLE preload ENGINE = BLACKHOLE SELECT * FROM table_to_preload_into_buffer_pool. Mir ist nicht bewusst, ob es eine Art von Konfigurationsoption gibt, mit der Sie diese beim Start laden können, aber dies sollte Ihnen helfen, den Pufferpool vorab zu laden. –

Antwort

1

Haben Sie EXPLAIN und Profiling überprüft?

Probe für die Profilerstellung

hier können Sie sehen, wo der Server die Zeit damit verbringt, und optimieren diese

MariaDB [yourschema]> set profiling=on; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [yourschema]> select * from table2 t1 left join table2 t2 ON t1.id <> t2.id;; 
+--------+------------+--------+------------+ 
| id  | val  | id  | val  | 
+--------+------------+--------+------------+ 
| 000002 | tabe 2 --2 | 000001 | tabe 2 --1 | 
.... 
| 000005 | tabe 2 --5 | 000004 | tabe 2 --4 | 
| 000006 | tabe 2 --6 | 000004 | tabe 2 --4 | 
| 000001 | tabe 2 --1 | 000005 | tabe 2 --5 | 
| 000002 | tabe 2 --2 | 000005 | tabe 2 --5 | 
| 000004 | tabe 2 --4 | 000005 | tabe 2 --5 | 
| 000006 | tabe 2 --6 | 000005 | tabe 2 --5 | 
| 000001 | tabe 2 --1 | 000006 | tabe 2 --6 | 
| 000002 | tabe 2 --2 | 000006 | tabe 2 --6 | 
| 000004 | tabe 2 --4 | 000006 | tabe 2 --6 | 
| 000005 | tabe 2 --5 | 000006 | tabe 2 --6 | 
+--------+------------+--------+------------+ 
20 rows in set (0.00 sec) 


MariaDB [yourschema]> show profile all; 
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+---------------+-------------+ 
| Status    | Duration | CPU_user | CPU_system | Context_voluntary | Context_involuntary | Block_ops_in | Block_ops_out | Messages_sent | Messages_received | Page_faults_major | Page_faults_minor | Swaps | Source_function  | Source_file | Source_line | 
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+---------------+-------------+ 
| starting    | 0.000113 | 0.000072 | 0.000041 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     2 |  0 | NULL     | NULL   |  NULL | 
| checking permissions | 0.000006 | 0.000003 | 0.000003 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | check_access   | sql_parse.cc |  6051 | 
| checking permissions | 0.000005 | 0.000004 | 0.000001 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | check_access   | sql_parse.cc |  6051 | 
| Opening tables  | 0.000307 | 0.000071 | 0.000236 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     9 |  0 | open_tables   | sql_base.cc |  4509 | 
| After opening tables | 0.000010 | 0.000006 | 0.000003 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | open_tables   | sql_base.cc |  4747 | 
| System lock   | 0.000005 | 0.000004 | 0.000002 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | mysql_lock_tables  | lock.cc  |   308 | 
| Table lock   | 0.000010 | 0.000009 | 0.000001 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | mysql_lock_tables  | lock.cc  |   313 | 
| init     | 0.000027 | 0.000025 | 0.000002 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | mysql_select   | sql_select.cc |  3427 | 
| optimizing   | 0.000014 | 0.000012 | 0.000001 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | optimize_inner  | sql_select.cc |  1092 | 
| statistics   | 0.000022 | 0.000021 | 0.000002 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | optimize_inner  | sql_select.cc |  1373 | 
| preparing   | 0.000117 | 0.000037 | 0.000084 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     4 |  0 | optimize_inner  | sql_select.cc |  1398 | 
| executing   | 0.000010 | 0.000004 | 0.000003 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | exec_inner   | sql_select.cc |  2551 | 
| Sending data   | 0.000106 | 0.000102 | 0.000003 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | exec_inner   | sql_select.cc |  3223 | 
| end     | 0.000007 | 0.000004 | 0.000003 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | mysql_select   | sql_select.cc |  3462 | 
| query end   | 0.000008 | 0.000006 | 0.000001 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | mysql_execute_command | sql_parse.cc |  5687 | 
| closing tables  | 0.000004 | 0.000003 | 0.000002 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | close_thread_tables | sql_base.cc |   935 | 
| Unlocking tables  | 0.000008 | 0.000007 | 0.000001 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | mysql_unlock_tables | lock.cc  |   395 | 
| freeing items  | 0.000008 | 0.000006 | 0.000002 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | mysql_parse   | sql_parse.cc |  7319 | 
| updating status  | 0.000023 | 0.000008 | 0.000015 |     0 |     0 |   0 |    0 |    1 |     0 |     0 |     0 |  0 | dispatch_command  | sql_parse.cc |  1937 | 
| cleaning up   | 0.000004 | 0.000002 | 0.000002 |     0 |     0 |   0 |    0 |    0 |     0 |     0 |     0 |  0 | dispatch_command  | sql_parse.cc |  1956 | 
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+---------------+-------------+ 
20 rows in set (0.00 sec) 

MariaDB [yourschema]>