Mysql は非常に優れた無料データベースとして広く利用されており、通常私たちが開発するプロジェクトのデータが 100 万を超えることはほとんどありません。最近、私は数百万のデータの場合の mysql の最適化に関する詳細な研究に多くの時間を費やしました。たくさんの問題に遭遇して解決したので、それを皆さんと共有したいと思います。貴重なご意見大歓迎です!
関連する推奨事項: 「MySQL チュートリアル 」
テスト環境
データの総数は 300 万で、約1G のディスク容量
データ構造
表1 news [ 文章表 引擎 myisam 字符集 utf-8 ] ----------------------------------------------------- idint11主键自动增加 cateint11索引 titlevarchar200标题(便于基础搜索做了索引) contenttext文章正文 dateint11文章发布时间(时间戳形式)
表2 cate [ 文章分类表 引擎 myisam 字符集 utf-8 ] ----------------------------------------------------- cate_idint11主键自动增加 cate_namevarchar200文章标题
クエリ総数
myIsam 引擎下 select count(*) as total from news //耗时 0.001秒 极快 //带上条件 select count(*) as total from news where cate = 1 耗时 0.046秒 可以接受的速度 innodb 引擎下 select count(*) as total from news //耗时 0.7秒 很慢 select count(*) as total from news where cate = 1 耗时 0.7秒 很慢
理由2 つのエンジンのクエリ速度は大きく異なりますか?
InnoDB はテーブル内の特定の行数を保存しません。つまり、select count(*) from table を実行するとき、InnoDB はテーブル全体をスキャンして、そこにある行数を計算する必要があります。は。
MyISAM は保存された行数を読み取るだけです。
count(*) ステートメントに where 条件が含まれている場合、2 つのテーブルの操作は若干異なることに注意してください。InnoDB タイプのテーブルは count(*) または count (主キー) に加えて wherecol 条件を使用します。 。 Col列は、テーブルの主キー以外の一意性制約インデックスを持つ列です。この方法では、クエリ速度が非常に速くなります。これは、テーブル全体のスキャンを回避するためです。
概要
mysql は count(*) を使用して 300 万個のデータ (myisam エンジン) のデータの総数をクエリし、条件を含みます (インデックスは正しく設定されています) )、実行時間は正常です。頻繁に読み取られるデータの場合は、myIsam エンジンを使用することをお勧めします。
以上が数百万のデータを含む mysql テスト環境の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。