Eine ausgereifte Datenbankarchitektur ist nicht von Anfang an auf hohe Verfügbarkeit, hohe Skalierbarkeit und andere Funktionen ausgelegt, sondern auf die Erhöhung der Anzahl Die Infrastruktur wurde schrittweise verbessert. In diesem Blogbeitrag geht es hauptsächlich um die Probleme und Optimierungslösungen, mit denen der Entwicklungszyklus der MySQL-Datenbank konfrontiert ist. Abgesehen von der Front-End-Anwendung ist er grob in die folgenden fünf Phasen unterteilt:
Nach der Genehmigung des Projekts entwickelt die Entwicklungsabteilung das Projekt gemäß den Anforderungen der Produktabteilung. Teil der Arbeit des Entwicklungsingenieurs besteht darin, die Tabellenstruktur zu entwerfen. Für Datenbanken ist dies sehr wichtig, wenn es nicht richtig gestaltet ist, wirkt es sich direkt auf die Zugriffsgeschwindigkeit und das Benutzererlebnis aus. Es gibt viele Einflussfaktoren, wie z. B. langsame Abfragen, ineffiziente Abfrageanweisungen, unsachgemäße Indizierung, Datenbanküberlastung (Deadlock) usw. Natürlich gibt es ein Team von Testingenieuren, die Stresstests durchführen und Fehler finden. Für Teams ohne Testingenieure werden die meisten Entwicklungsingenieure nicht zu viel darüber nachdenken, ob das Datenbankdesign in der frühen Phase sinnvoll ist, sondern die Funktionsimplementierung und -bereitstellung so schnell wie möglich abschließen, nachdem das Projekt eine bestimmte Anzahl von Besuchen hat Versteckte Probleme werden aufgedeckt. Es wird nicht so einfach sein, es erneut zu ändern.
Der Betriebs- und Wartungsingenieur ist nicht erschienen sehr groß, sodass eine einzelne Bereitstellung ausreicht, um etwa 1500 QPS (Abfragerate pro Sekunde) zu bewältigen. Unter Berücksichtigung der Hochverfügbarkeit können MySQL-Master-Slave-Replikation + Keepalived für Doppelklick-Hot-Backups verwendet werden. Die gängige Cluster-Software umfasst Keepalived und Heartbeat.
Dual-Machine-Hot-Standby-Blogbeitrag: http://www.php.cn/
Wenn MySQL auf einem normalen Server bereitgestellt wird, verlangsamt sich die Datenbankverarbeitungsleistung und die Hardwareressourcen sind immer noch reichlich vorhanden. Zu diesem Zeitpunkt ist es an der Zeit, über Softwareprobleme nachzudenken. Wie kann also die Leistung der Datenbank maximiert werden? Einerseits können mehrere MySQL-Instanzen auf einem einzigen Server ausgeführt werden, um die Serverleistung zu maximieren. Andererseits sind die Standardkonfigurationen des Betriebssystems und der Datenbank relativ konservativ, was gewisse Einschränkungen mit sich bringt Die Leistung der Datenbank kann entsprechend angepasst werden, um so viele Verbindungen wie möglich zu verarbeiten.
Die spezifische Optimierung umfasst die folgenden drei Ebenen:
3.1 Optimierung der Datenbankkonfiguration
In MySQL werden häufig zwei Speicher-Engines verwendet, eine davon ist MyISAM , was nicht unterstützt wird. Transaktionsverarbeitung, schnelle Leseleistung und Sperren auf Tabellenebene. Das andere ist InnoDB, das die Transaktionsverarbeitung (ACID) unterstützt. Das Designziel besteht darin, die Leistung und Sperren auf Zeilenebene für die Verarbeitung großer Datenmengen zu maximieren.
Tabellensperre: geringer Overhead, große Sperrgranularität, hohe Wahrscheinlichkeit eines Deadlocks und relativ geringe Parallelität.
Zeilensperre: hoher Overhead, kleine Sperrgranularität, geringe Wahrscheinlichkeit eines Deadlocks und relativ hohe Parallelität.
Warum kommt es zu Tabellensperren und Zeilensperren? Der Hauptzweck besteht darin, die Integrität der Daten sicherzustellen. Wenn beispielsweise ein Benutzer eine Tabelle bedient und andere Benutzer die Tabelle ebenfalls bedienen möchten, müssen sie warten, bis der erste Benutzer den Vorgang abgeschlossen hat, bevor andere Benutzer arbeiten können. Tabellensperren und Zeilen Das ist es, was Sperren bewirken. Andernfalls kommt es mit Sicherheit zu Datenkonflikten oder Anomalien, wenn mehrere Benutzer gleichzeitig eine Tabelle bedienen.
Basierend auf dem oben Gesagten ist die Verwendung der InnoDB-Speicher-Engine die beste Wahl und sie ist auch die Standard-Speicher-Engine in MySQL 5.5 und späteren Versionen. Mit jeder Speicher-Engine sind viele Parameter verbunden. Die Parameter, die sich hauptsächlich auf die Datenbankleistung auswirken, sind unten aufgeführt.
Standardwert der öffentlichen Parameter:
max_connections = 151 #同时处理最大连接数,推荐设置最大连接数是上限连接数的80%左右 sort_buffer_size = 2M #查询排序时缓冲区大小,只对order by和group by起作用,可增大此值为16M query_cache_limit = 1M #查询缓存限制,只有1M以下查询结果才会被缓存,以免结果数据较大把缓存池覆盖 query_cache_size = 16M #查看缓冲区大小,用于缓存SELECT查询结果,下一次有同样SELECT查询将直接从缓存池返回结果,可适当成倍增加此值 open_files_limit = 1024 #打开文件数限制,如果show global status like 'open_files'查看的值等于或者大于open_files_limit值时,程序会无法连接数据库或卡死
Standardwert der MyISAM-Parameter:
key_buffer_size = 16M #索引缓存区大小,一般设置物理内存的30-40% read_buffer_size = 128K #读操作缓冲区大小,推荐设置16M或32M
Standardwert der InnoDB-Parameter:
innodb_buffer_pool_size = 128M #索引和数据缓冲区大小,一般设置物理内存的60%-70% innodb_buffer_pool_instances = 1 #缓冲池实例个数,推荐设置4个或8个 innodb_flush_log_at_trx_commit = 1 #关键参数,0代表大约每秒写入到日志并同步到磁盘,数据库故障会丢失1秒左右事务数据。1为每执行一条SQL后写入到日志并同步到磁盘,I/O开销大,执行完SQL要等待日志读写,效率低。2代表只把日志写入到系统缓存区,再每秒同步到磁盘,效率很高,如果服务器故障,才会丢失事务数据。对数据安全性要求不是很高的推荐设置2,性能高,修改后效果明显。 innodb_file_per_table = OFF #默认是共享表空间,共享表空间idbdata文件不断增大,影响一定的I/O性能。推荐开启独立表空间模式,每个表的索引和数据都存在自己独立的表空间中,可以实现单表在不同数据库中移动。 innodb_log_buffer_size = 8M #日志缓冲区大小,由于日志最长每秒钟刷新一次,所以一般不用超过16M
3.2 Systemkernoptimierung
Der größte Teil von MySQL wird auf Linux-Systemen bereitgestellt, daher wirken sich einige Parameter des Betriebssystems auch auf die MySQL-Leistung aus. Im Folgenden wird die entsprechende Optimierung des Linux-Kernels beschrieben.
net.ipv4.tcp_fin_timeout = 30 #TIME_WAIT超时时间,默认是60s net.ipv4.tcp_tw_reuse = 1 #1表示开启复用,允许TIME_WAIT socket重新用于新的TCP连接,0表示关闭 net.ipv4.tcp_tw_recycle = 1 #1表示开启TIME_WAIT socket快速回收,0表示关闭 net.ipv4.tcp_max_tw_buckets = 4096 #系统保持TIME_WAIT socket最大数量,如果超出这个数,系统将随机清除一些TIME_WAIT并打印警告信息 net.ipv4.tcp_max_syn_backlog = 4096 #进入SYN队列最大长度,加大队列长度可容纳更多的等待连接
Wenn im Linux-System die Anzahl der von einem Prozess geöffneten Dateihandles den Systemstandardwert von 1024 überschreitet, wird die Meldung „Zu viele Dateien geöffnet“ angezeigt, sodass die Grenze für geöffnete Dateihandles festgelegt ist muss angepasst werden.
# vi /etc/security/limits.conf #加入以下配置,*代表所有用户,也可以指定用户,重启系统生效 * soft nofile 65535 * hoft nofile 65535 # ulimit -SHn 65535 #立刻生效
3.3 Hardwarekonfiguration
Erhöhen Sie den physischen Speicher und verbessern Sie die Dateisystemleistung. Der Linux-Kernel weist Cache-Bereiche (System-Cache und Daten-Cache) aus dem Speicher zu, um heiße Daten zu speichern. Durch den verzögerten Schreibmechanismus des Dateisystems erfolgt die Synchronisierung nur, wenn Bedingungen erfüllt sind (z. B. wenn der Cache-Bereich einen bestimmten Prozentsatz erreicht oder die Synchronisierung erfolgt). Befehl, der gerade ausgeführt wird). Mit anderen Worten: Je größer der physische Speicher, desto größer der zugewiesene Cache-Bereich und desto mehr zwischengespeicherte Daten. Natürlich geht bei einem Serverausfall eine gewisse Menge an zwischengespeicherten Daten verloren.
SSD-Festplatte ersetzt SAS-Festplatte, und der RAID-Level wird auf RAID1+0 angepasst, was eine bessere Lese- und Schreibleistung (IOPS) als RAID1 und RAID5 bietet. Schließlich kommt der Druck hauptsächlich auf die Datenbank von Festplatten-E/A.
Mit zunehmendem Geschäftsvolumen kann die Leistung eines einzelnen Datenbankservers die Geschäftsanforderungen nicht mehr erfüllen Es ist Zeit, darüber nachzudenken, eine Maschine hinzuzufügen, und es ist Zeit, einen Cluster zu erstellen~~~. Die Hauptidee besteht darin, die Last einer einzelnen Datenbank zu zerlegen, die Festplatten-E/A-Leistung zu durchbrechen, heiße Daten im Cache zu speichern und die Häufigkeit des Festplatten-E/A-Zugriffs zu reduzieren.
4.1 Master-Slave-Replikation und Lese-Schreib-Trennung
Da es sich bei den meisten Datenbankvorgängen in der Produktionsumgebung um Lesevorgänge handelt, setzen wir eine Ein-Master-Mehrfach-Slave-Architektur ein. Die Master-Datenbank ist für Schreibvorgänge und Doppelklicks verantwortlich Hot-Backup und mehrere Slave-Datenbanken übernehmen den Lastausgleich. Zu den Mainstream-Load-Balancern gehören LVS, HAProxy und Nginx. Wie erreicht man die Trennung von Lesen und Schreiben? Die meisten Unternehmen implementieren die Trennung von Lesen und Schreiben auf Codeebene, was effizienter ist. Eine andere Möglichkeit besteht darin, die Lese-/Schreibtrennung über ein Proxy-Programm zu erreichen, was in Unternehmen selten verwendet wird. Zu den gängigen Proxy-Programmen gehören MySQL Proxy und Amoeba. In einer solchen Datenbank-Cluster-Architektur wird die hohe Parallelitätsfähigkeit der Datenbank erheblich erhöht und das Problem des Leistungsengpasses bei einzelnen Maschinen gelöst. Wenn eine Slave-Datenbank 2000 QPS verarbeiten kann, können 5 Slave-Datenbanken 10.000 QPS verarbeiten, und die horizontale Skalierbarkeit der Datenbank ist ebenfalls sehr einfach.
Manchmal kann die Schreibleistung einer einzelnen Einheit bei Anwendungen mit einer großen Anzahl von Schreibvorgängen die Geschäftsanforderungen nicht erfüllen. Wenn Sie über zwei Master verfügen, treten Inkonsistenzen in den Datenbankdaten auf. Der Grund dafür ist, dass verschiedene Benutzer in der Anwendung möglicherweise zwei Datenbanken betreiben und gleichzeitige Aktualisierungsvorgänge zu Konflikten oder Inkonsistenzen in den Datenbankdaten der beiden Datenbanken führen. Bei Verwendung einer einzelnen Datenbank verwendet MySQL die Tabellensperren und Zeilensperren der Speicher-Engine, um die Datenintegrität sicherzustellen. Wie kann dieses Problem gelöst werden, wenn mehrere Hauptdatenbanken verwendet werden? Es gibt eine Reihe von Master-Slave-Replikationsverwaltungstools, die auf der Perl-Sprache basieren und als MySQL-MMM (Master-Master-Replikationsmanager für MySQL, MySQL-Master-Master-Replikationsmanager) bezeichnet werden Ein Datenbank-Schreibvorgang gleichzeitig.
4.2 Cache hinzufügen
Ein Cache-System zur Datenbank hinzufügen, heiße Daten zwischenspeichern zu Im Speicher, Wenn im Speichercache Daten angefordert werden müssen, werden die Ergebnisse nicht mehr an die Datenbank zurückgegeben, um die Leseleistung zu verbessern. Caching-Implementierungen umfassen lokales Caching und verteiltes Caching. Lokales Caching speichert Daten im lokalen Serverspeicher oder in Dateien, was schnell ist. Distributed kann große Datenmengen zwischenspeichern und ist einfach zu erweitern. Mainstream-Distributed-Caching-Systeme umfassen Memcached und Memcached. Die Daten werden im Speicher zwischengespeichert ca. 8w erreicht werden. Wenn Sie Datenpersistenz wünschen, verwenden Sie Redis. Die Leistung ist nicht geringer als bei Memcached. Arbeitsprozess:
4.3 UnterbibliothekUnterbibliothek basiert auf verschiedenen Die Tabellen sind in verschiedene Datenbanken unterteilt, z. B. Web, BBS, Blog und andere Bibliotheken. Wenn das Geschäftsvolumen groß ist, kann die geteilte Bibliothek auch als Master-Slave-Architektur verwendet werden, um eine übermäßige Belastung einer einzelnen Bibliothek weiter zu vermeiden.
4.4 TabellenDie Datenmenge in einer bestimmten Tabelle in der Datenbank nimmt zu, was dazu führt, dass das Abfragen und Einfügen zu lange dauert Ist das möglich? Wie wäre es mit der Lösung des Drucks auf einem einzelnen Messgerät? Sie sollten überlegen, ob Sie diese Tabelle in mehrere kleine Tabellen aufteilen möchten, um den Druck auf eine einzelne Tabelle zu verringern und die Verarbeitungseffizienz zu verbessern. Diese Methode wird als Tabellenaufteilung bezeichnet.
Die Tabellenaufteilungstechnologie ist mühsam. Sie müssen die SQL-Anweisungen im Programmcode ändern und andere Tabellen manuell erstellen. Sie können auch die Merge-Storage-Engine verwenden, um die Tabellenaufteilung zu implementieren. Nachdem die Tabelle geteilt wurde, arbeitet das Programm mit einer Master-Tabelle. Diese Master-Tabelle speichert nur einige Beziehungen zwischen den Untertabellen und wie die Daten aktualisiert werden basierend auf verschiedenen Abfragen, wodurch die Parallelität und die Festplatten-E/A-Leistung verbessert werden.
Die Tabellenaufteilung ist in vertikale und horizontale Aufteilung unterteilt:
Vertikale Aufteilung: Teilen Sie die ursprüngliche Tabelle mit vielen Feldern in mehrere Tabellen auf, um das Problem der Tabellenbreite zu lösen. Sie können selten verwendete Felder in einer separaten Tabelle ablegen, Sie können große Felder in einer separaten Tabelle ablegen oder Sie können eng verwandte Felder in einer Tabelle ablegen.
Horizontale Aufteilung: Teilen Sie die ursprüngliche Tabelle in mehrere Tabellen auf. Jede Tabelle hat die gleiche Struktur, um das Problem des großen Datenvolumens in einer einzelnen Tabelle zu lösen.
4.5 Partitionieren
Partitionierung bedeutet, die Daten einer Tabelle in mehrere Blöcke aufzuteilen. Diese Blöcke können sich nach der Partitionierung auf einer Festplatte befinden An der Oberfläche handelt es sich immer noch um eine Tabelle, aber die Daten werden an mehreren Orten gehasht. Auf diese Weise können mehrere Festplatten gleichzeitig unterschiedliche Anforderungen verarbeiten, wodurch die Lese- und Schreibleistung der Festplatten-E/A verbessert wird und die Implementierung relativ einfach ist .
Hinweis: Das Hinzufügen von Cache, Unterbibliothek, Untertabelle und Partition wird hauptsächlich von Programmierern implementiert.
Datenbankwartung ist die Hauptarbeit von Betriebs- und Wartungsingenieuren oder DBAs, einschließlich Leistungsüberwachung, Leistungsanalyse und Leistung Optimierung, Datenbanksicherung und -wiederherstellung usw.
5.1 Schlüsselindikatoren für den Leistungsstatus
QPS, Abfragen pro Sekunde: die Anzahl der Abfragen pro Sekunde, die Anzahl der Abfragen, die eine Datenbank pro Sekunde verarbeiten kann
TPS, Transaktionen pro Sekunde: Anzahl der pro Sekunde verarbeiteten Transaktionen
Überprüfen Sie den laufenden Status durch Show Status. Es gibt mehr als 300 Statusinformationsdatensätze, die hilfreich sein können Wir berechnen QPS und TPS wie folgt:
Betriebszeit: Die tatsächliche Häufigkeit, mit der der Server ausgeführt wurde, in Sekunden
Fragen: Die Anzahl der Abfragen, die an die Datenbank gesendet wurden
Com_select: Die Anzahl der Abfragen, die tatsächliche Anzahl der Datenbankoperationen
Com_insert: Anzahl der Einfügungen
Com_delete: Anzahl der Löschungen
Com_update: Anzahl von Updates
Com_commit: Anzahl der Transaktionen
Com_rollback: Anzahl der Rollbacks
Dann kommt hier die Berechnungsmethode, berechnen Sie QPS basierend auf Fragen:
mysql> show global status like 'Questions'; mysql> show global status like 'Uptime';
QPS = Questions / Uptime
基于Com_commit和Com_rollback计算出TPS:
mysql> show global status like 'Com_commit'; mysql> show global status like 'Com_rollback'; mysql> show global status like 'Uptime'; TPS = (Com_commit + Com_rollback) / Uptime
另一计算方式:基于Com_select、Com_insert、Com_delete、Com_update计算出QPS
mysql> show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
等待1秒再执行,获取间隔差值,第二次每个变量值减去第一次对应的变量值,就是QPS
TPS计算方法:
mysql> show global status where Variable_name in('com_insert','com_delete','com_update');
计算TPS,就不算查询操作了,计算出插入、删除、更新四个值即可。
经网友对这两个计算方式的测试得出,当数据库中myisam表比较多时,使用Questions计算比较准确。当数据库中innodb表比较多时,则以Com_*计算比较准确。
5.2 开启慢查询日志
MySQL开启慢查询日志,分析出哪条SQL语句比较慢,使用set设置变量,重启服务失效,可以在my.cnf添加参数永久生效。
mysql> set global slow-query-log=on #开启慢查询功能 mysql> set global slow_query_log_file='/var/log/mysql/mysql-slow.log'; #指定慢查询日志文件位置 mysql> set global log_queries_not_using_indexes=on; #记录没有使用索引的查询 mysql> set global long_query_time=1; #只记录处理时间1s以上的慢查询
分析慢查询日志,可以使用MySQL自带的mysqldumpslow工具,分析的日志较为简单。
# mysqldumpslow -t 3 /var/log/mysql/mysql-slow.log #查看最慢的前三个查询
也可以使用percona公司的pt-query-digest工具,日志分析功能全面,可分析slow log、binlog、general log。
分析慢查询日志:pt-query-digest /var/log/mysql/mysql-slow.log
分析binlog日志:mysqlbinlog mysql-bin.000001 >mysql-bin.000001.sql
pt-query-digest –type=binlog mysql-bin.000001.sql
分析普通日志:pt-query-digest –type=genlog localhost.log
5.3 数据库备份
备份数据库是最基本的工作,也是最重要的,否则后果很严重,你懂得!但由于数据库比较大,上百G,往往备份都很耗费时间,所以就该选择一个效率高的备份策略,对于数据量大的数据库,一般都采用增量备份。常用的备份工具有mysqldump、mysqlhotcopy、xtrabackup等,mysqldump比较适用于小的数据库,因为是逻辑备份,所以备份和恢复耗时都比较长。mysqlhotcopy和xtrabackup是物理备份,备份和恢复速度快,不影响数据库服务情况下进行热拷贝,建议使用xtrabackup,支持增量备份。
Xtrabackup备份工具使用博文:http://www.php.cn/
5.4 数据库修复
有时候MySQL服务器突然断电、异常关闭,会导致表损坏,无法读取表数据。这时就可以用到MySQL自带的两个工具进行修复,myisamchk和mysqlcheck。
myisamchk: kann nur die Myisam-Tabelle reparieren, die Datenbank muss gestoppt werden
Allgemeine Parameter:
-f – erzwingen Reparatur erzwingen, alte temporäre Dateien überschreiben, im Allgemeinen nicht verwenden
-r – Wiederherstellungsmodus wiederherstellen
-q – schnelle schnelle Wiederherstellung
-a – Analysetabelle analysieren
-o – alten Wiederherstellungsmodus sicher wiederherstellen Wenn r nicht repariert werden kann, können Sie diesen Parameter ausprobieren
-F –fast überprüft nur die Tabellen, die nicht normal geschlossen sind
Reparieren Sie die Weibo-Datenbank schnell:
# cd /var/lib /mysql/weibo
# myisamchk -r -q *.MYI
mysqlcheck: Sowohl Myisam- als auch Innodb-Tabellen können verwendet werden. Es besteht keine Notwendigkeit, die Datenbank zu stoppen. Wenn Sie eine einzelne Tabelle reparieren möchten, können Sie sie nach dem Tabellennamen hinzufügen, getrennt durch Leerzeichen
Allgemeine Parameter:
-a –all-databases Alle Bibliotheken überprüfen
-r – Reparatur-Reparaturtabelle
- c – Prüftabelle prüfen, Standardoption
-a – Analysetabelle analysieren
-o – Optimierungstabelle optimieren
-q –schnellste Überprüfung oder Reparatur einer Tabelle
-F –schnellste Überprüfung nur von Tabellen, die nicht normal geschlossen wurden
Schnelle Reparatur der Weibo-Datenbank:
mysqlcheck -r -q -uroot -p123 weibo
5.5 Überprüfen Sie außerdem die CPU- und E/A-Leistungsmethode
# Überprüfen Sie die CPU-Leistung
#Parameter -P dient zur Anzeige der Anzahl der CPUs, ALLE Für alle können Sie auch nur die ersten paar anzeigen
#E/A-Leistung anzeigen
#Parameter -m Es wird in M-Einheiten angezeigt, der Standardwert ist K
#%util: Wenn es 100 % erreicht, bedeutet dies, dass die E/A sehr ausgelastet ist.
#await: Die Zeit, die die Anfrage in der Warteschlange wartet, wirkt sich direkt auf die Lesezeit aus.
E/A-Grenze: IOPS (r/s+w/s), im Allgemeinen etwa 1200. (IOPS, die Anzahl der Lese- und Schreibvorgänge (E/A) pro Sekunde)
E/A-Bandbreite: Im sequentiellen Lese- und Schreibmodus beträgt der theoretische Wert der SAS-Festplatte etwa 300 M/s Der theoretische Wert einer SSD-Festplatte liegt bei etwa 600 M/s.
Die oben genannten sind einige der wichtigsten Optimierungslösungen, die ich nach dreijähriger Verwendung von MySQL zusammengefasst habe. Die Funktionen sind begrenzt und einige sind nicht umfassend, aber sie können grundsätzlich die Datenbankanforderungen kleiner und mittlerer Unternehmen erfüllen . Aufgrund der Einschränkungen des ursprünglichen Designs relationaler Datenbanken haben einige BAT-Unternehmen riesige Datenmengen in relationale Datenbanken eingegeben und konnten bei der Abfrage und Analyse umfangreicher Daten keine bessere Leistung erzielen. Daher haben nicht-relationale Datenbanken große Datenmengen und eine hohe Leistung erzielt. Sie gleichen auch einige Mängel relationaler Datenbanken aus. Nach und nach haben die meisten Unternehmen einige Geschäftsdatenbanken wie MongoDB, HBase usw. gespeichert. Zur Datenspeicherung werden verteilte Dateisysteme wie HDFS, GFS usw. verwendet. Für die Berechnung und Analyse umfangreicher Daten werden Hadoop, Spark, Storm usw. verwendet. Dies sind Spitzentechnologien im Zusammenhang mit Betrieb und Wartung, und sie sind auch die wichtigsten Lernobjekte im Bereich Lagerung. Wenn ein Blogger einen besseren Optimierungsplan hat, teilen Sie ihn bitte mit.
Das Obige ist eine detaillierte Erklärung der MySQL-Datenbankoptimierung. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).