検索
ホームページデータベースmysql チュートリアルmysql を最適化するいくつかの方法
mysql を最適化するいくつかの方法Jul 20, 2019 pm 03:23 PM
mysqlデータベース

mysql を最適化するいくつかの方法

#推奨チュートリアル:

MySQL チュートリアル

## 1適切なストレージ エンジンを選択してください: InnoDB

データ テーブルが読み取り専用またはフルテキスト検索に使用されない限り (フルテキスト検索になると MYSQL を使用する人はいないと思います) -最近のテキスト検索) )。デフォルトでは InnoDB を選択する必要があります。

自分でテストすると、MyISAM が InnoDB よりも高速であることがわかるかもしれません。これは、MyISAM はインデックスのみをキャッシュしますが、InnoDB はデータとインデックスをキャッシュし、MyISAM はトランザクションをサポートしないためです。ただし、innodb_flush_log_at_trx_commit = 2 を使用すると、ほぼ同等の読み取りパフォーマンス (100 倍の差) を得ることができます。

1.1 既存の MyISAM データベースを InnoDB に変換する方法:

mysql -u [USER_NAME] -p -e "SHOW TABLES IN [DATABASE_NAME];" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=InnoDB;" > alter_table.sql
perl -p -i -e 's/(search_[a-z_]+ ENGINE=)InnoDB//1MyISAM/g' alter_table.sql
mysql -u [USER_NAME] -p [DATABASE_NAME] < alter_table.sql

1.2 それぞれの InnoDB を作成します各テーブルのファイル:

innodb_file_per_table=1

これにより、ibdata1 ファイルが大きくなりすぎないようになります。制御不能。特に mysqlcheck -o –all-databases を実行する場合。

#2. データがメモリから読み取られていることを確認します。メモリに保存されるデータについて話す

##2.1 十分な大きさの innodb_buffer_pool_size

すべてを保存することをお勧めしますinnodb_buffer_pool_size 内のデータ。つまり、ストレージ量に応じて innodb_buffer_pool_size の容量を計画します。このようにして、メモリからデータ全体を読み取ることができます。ディスク操作を最小限に抑えます。

2.1.1 innodb_buffer_pool_size が十分な大きさであることを確認する方法。データはハードドライブではなくメモリから読み取られていますか?

メソッド 1

mysql> SHOW GLOBAL STATUS LIKE &#39;innodb_buffer_pool_pages_%&#39;;
+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| Innodb_buffer_pool_pages_data    | 129037 |
| Innodb_buffer_pool_pages_dirty   | 362    |
| Innodb_buffer_pool_pages_flushed | 9998   |
| Innodb_buffer_pool_pages_free    | 0      |  !!!!!!!!
| Innodb_buffer_pool_pages_misc    | 2035   |
| Innodb_buffer_pool_pages_total   | 131072 |
+----------------------------------+--------+
6 rows in set (0.00 sec)
Innodb_buffer_pool_pages_free が 0 であることが判明した場合、バッファーがプールが使い果たされました。innodb_buffer_pool_size

InnoDB の他のいくつかのパラメータを増やす必要があります:

innodb_additional_mem_pool_size = 1/200 of buffer_pool
innodb_max_dirty_pages_pct 80%
メソッド 2

または、iostat -d -x -k 1 コマンドを使用して、ハードディスクの動作を確認します。

2.1.2 サーバーに計画に必要なメモリがあるかどうか

echo 1 > /proc を実行します。 /sys/vm/drop_caches オペレーティング システムのファイル キャッシュをクリアします。実際のメモリ使用量を確認する機能。

2.2 データウォーミング

デフォルトでは、データは 1 回読み取られた場合にのみキャッシュされます。 innodb_buffer_pool。したがって、データベースは起動したばかりで、データをウォームアップし、ディスク上のすべてのデータをメモリにキャッシュする必要があります。

データを予熱すると、読み取り速度が向上します。

InnoDB データベースの場合、次の方法を使用してデータをウォームアップできます。

1. 次のスクリプトを MakeSelectQueriesToLoad.sql として保存します。

SELECT DISTINCT
    CONCAT(&#39;SELECT &#39;,ndxcollist,&#39; FROM &#39;,db,&#39;.&#39;,tb,
    &#39; ORDER BY &#39;,ndxcollist,&#39;;&#39;) SelectQueryToLoadCache
    FROM
    (
        SELECT
            engine,table_schema db,table_name tb,
            index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
        FROM
        (
            SELECT
                B.engine,A.table_schema,A.table_name,
                A.index_name,A.column_name,A.seq_in_index
            FROM
                information_schema.statistics A INNER JOIN
                (
                    SELECT engine,table_schema,table_name
                    FROM information_schema.tables WHERE
                    engine=&#39;InnoDB&#39;
                ) B USING (table_schema,table_name)
            WHERE B.table_schema NOT IN (&#39;information_schema&#39;,&#39;mysql&#39;)
            ORDER BY table_schema,table_name,index_name,seq_in_index
        ) A
        GROUP BY table_schema,table_name,index_name
    ) AA
ORDER BY db,tb
;
2.

mysql -uroot -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql

を実行します。 3. データベースを再起動するたび、またはデータベースを再起動する前にウォームアップが必要なときに実行します。データベース全体のバックアップ:

mysql -uroot < /root/SelectQueriesToLoad.sql > /dev/null 2>&1

2.3 SWAP

へのデータの保存を許可しない専用の MYSQL サーバーであると仮定します。 SWAP は共有サーバーであると仮定して無効にすることができ、innodb_buffer_pool_size が十分な大きさであることを確認してください。または、キャッシュに固定メモリ空間を使用し、memlock 命令を使用します。

3. データベースを定期的に最適化して再構築する

mysqlcheck - o –all-databases により、ibdata1 は成長し続けます。実際の最適化には、データ テーブル構造の再構築のみが含まれます:

CREATE TABLE mydb.mytablenew LIKE mydb.mytable;
INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytablenew RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;

4. ディスク書き込み操作の削減

#4.1 十分な大きさの書き込みキャッシュを使用する innodb_log_file_size

ただし、1G の innodb_log_file_size が使用されるという前提に注意する必要があります。サーバーがクラッシュした場合。回復には 10 分かかります。

innodb_log_file_size を 0.25 * innodb_buffer_pool_size

#4.2 innodb_flush_log_at_trx_commit

に設定することをお勧めします。

  这个选项和写磁盘操作密切相关:

  innodb_flush_log_at_trx_commit = 1 则每次改动写入磁盘

  innodb_flush_log_at_trx_commit = 0/2 每秒写入磁盘

  假设你的应用不涉及非常高的安全性 (金融系统),或者基础架构足够安全,或者 事务都非常小,都能够用 0 或者 2 来减少磁盘操作。

4.3 避免双写入缓冲

innodb_flush_method=O_DIRECT

5. 提高磁盘读写速度

  RAID0 尤其是在使用 EC2 这样的虚拟磁盘 (EBS) 的时候,使用软 RAID0 很重要。

6. 充分使用索引

6.1 查看现有表结构和索引

SHOW CREATE TABLE db1.tb1/G

6.2 加入必要的索引

  索引是提高查询速度的唯一方法。比方搜索引擎用的倒排索引是一样的原理。

  索引的加入须要依据查询来确定。比方通过慢查询日志或者查询日志,或者通过 EXPLAIN 命令分析查询。

ADD UNIQUE INDEX
ADD INDEX

6.2.1 比方,优化用户验证表:

  加入索引

ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);

  每次重新启动server进行数据预热

echo “select username,password from users;” > /var/lib/mysql/upcache.sql

  加入启动脚本到 my.cnf

[mysqld]
init-file=/var/lib/mysql/upcache.sql

6.2.2 使用自己主动加索引的框架或者自己主动拆分表结构的框架

  比方。Rails 这种框架。会自己主动加入索引。Drupal 这种框架会自己主动拆分表结构。

  会在你开发的初期指明正确的方向。所以,经验不太丰富的人一開始就追求从 0 開始构建,实际是不好的做法。

7. 分析查询日志和慢查询日志

  记录全部查询。这在用 ORM 系统或者生成查询语句的系统非常实用。

log=/var/log/mysql.log

  注意不要在生产环境用。否则会占满你的磁盘空间。

  记录运行时间超过 1 秒的查询:

long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log

8. 激进的方法。使用内存磁盘

  如今基础设施的可靠性已经非常高了,比方 EC2 差点儿不用操心server硬件当机。并且内存实在是廉价。非常easy买到几十G内存的server,能够用内存磁盘。定期备份到磁盘。

  将 MYSQL 文件夹迁移到 4G 的内存磁盘

mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=4000M tmpfs /mnt/ramdisk/
mv /var/lib/mysql /mnt/ramdisk/mysql
ln -s /tmp/ramdisk/mysql /var/lib/mysql
chown mysql:mysql mysql

9. 用 NOSQL 的方式使用 MYSQL

  B-TREE 仍然是最高效的索引之中的一个,全部 MYSQL 仍然不会过时。

  用 HandlerSocket 跳过 MYSQL 的 SQL 解析层。MYSQL 就真正变成了 NOSQL。

10. 其它

  ●单条查询最后添加 LIMIT 1,停止全表扫描。

  ●将非”索引”数据分离,比方将大篇文章分离存储,不影响其它自己主动查询。

  ●不用 MYSQL 内置的函数。由于内置函数不会建立查询缓存。

  ●PHP 的建立连接速度很快,全部能够不用连接池。否则可能会造成超过连接数。当然不用连接池 PHP 程序也可能将

  ●连接数占满比方用了 @ignore_user_abort(TRUE);

  ●使用 IP 而不是域名做数据库路径。避免 DNS 解析问题

以上がmysql を最適化するいくつかの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

mysql怎么删除unique keymysql怎么删除unique keyMay 12, 2022 pm 03:01 PM

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター