ホームページ  >  記事  >  バックエンド開発  >  mysql 20Wデータ1Gサイズみたいに使うと極端に遅いので解決してください

mysql 20Wデータ1Gサイズみたいに使うと極端に遅いので解決してください

PHPz
PHPzオリジナル
2016-06-13 13:28:172060ブラウズ

mysql 20W データ サイズ 1G のようなものを使用すると非常に遅いので、解決してください (関連する mysql ビデオ チュートリアルの推奨事項: "mysql チュートリアル")

$sql=SELECT *` FROM `text` where `title`LIKE '%bbd%' limit 0,10    
$sql=mysql_query($sql);

この方法。 in 1 数秒以内

ただし、いいねの総数を取得したい場合は、10 秒以上と非常に時間がかかります。 。 。解決策を求めてください。 。

$sqll=SELECT `id` FROM `title` where `title`LIKE '%bbd%'    
$sqll=mysql_query($sql);
$num = mysql_num_rows($sqll);

これには 10 秒以上かかりました

------解決策------- - ---------------

スフィンクスを使用して検索できます

- -----解決策----------------------

無理です。テーブル全体をスキャンしています。インデックスを作成できません!

-----解決策---------

$sqll = SELECT count(*) FROM `title` where `title`LIKE '%bbd%'  
$sqll = mysql_query($sql);
list($num) = mysql_fetch_row($sqll);

もっと早いかもしれません

-----解決策---------- - ----------

単純なインデックスの場合は、フルテキスト インデックスを直接使用する必要があります。複雑なインデックスの場合は、サードパーティのストレージを使用します。スフィンクスなどのエンジンはxとかもあり、Doubanが使っています。

-----解決策---------

select * from tableA from content like "xxx%"

mysql がインデックスを使用する唯一の方法のようです。フルテキストがインデックス化されている場合でも、独自のデータベースの実際の状況に基づいて分析する必要があります。

フルテキストはおそらく次のように機能します

1。 MyISAM テーブルにのみ使用されます
2. MATCH (col1,col2,...) AGAINST ('取得された文字列') を使用して

をクエリします。例: フルテキスト インデックスを追加します。テーブルへの列

ALTER TABLE `text` ADD FULLTEXT `fidx_title` (`title`)
2. クエリの実行


SELECT * FROM `text`WHERE MATCH (title)AGAINST ('ddd')
難しいと出来ません。 。


-----解決策---------

只有fulltext查询了。mysql一到一定的大小,就奇慢无比。

-----解決策---------------------------- --

コピーして貼り付けます。実際、自分で GG することができます。重要なのは、トランザクションが必要かどうかです...

innodb

InnoDB MySQL にトランザクション (コミット) とロールバック (ロールバック) およびクラッシュ回復機能のトランザクションセーフ (ACID 準拠) テーブルを提供します。 InnoDB は、Oracle タイプと一貫した SELECT での行ロック (行レベルでのロック) と非ロック読み取りを提供します。これらの機能により、マルチユーザーの同時操作のパフォーマンスが向上します。

InnoDB の列ロック (行レベルのロック) は非常に小さなスペースに収まるため、InnoDB テーブルでロックを拡張する (ロック エスカレーション) 必要はありません。 InnoDB は、外部キー制約 (FOREIGN KEY 制約) を提供する MySQL 上の最初のテーブル エンジンです。

InnoDB は大容量データベース システムを処理できるように設計されており、その CPU 使用率は他のディスク ベースのリレーショナル データベース エンジンに匹敵しません。技術的には、InnoDB は MySQL バックグラウンド上に配置された完全なデータベース システムであり、データとインデックスをキャッシュするためにメイン メモリ内に独自の専用バッファ プールを確立します。


InnoDB は、データとインデックスをテーブル スペースに格納します。テーブル スペースには複数のファイルが含まれる場合があります。これは、他のファイルとは異なります。たとえば、MyISAM では、テーブルが個別のファイルに格納されます。 InnoDB テーブルのサイズは、オペレーティング システムのファイル サイズによってのみ制限されます。通常は 2 GB です。

InnoDB 内のすべてのテーブルは同じデータ ファイル ibdata1 に保存されます (複数のファイルまたは独立したテーブル スペース ファイルである場合もあります)。無料の解決策は、データ ファイルをコピーすることです。 binlog をバックアップするか、mysqldump を使用します。

MyISAM

MyISAM は MySQL のデフォルトのストレージ エンジンです。

各 MyISAM テーブルは 3 つのファイルに保存されます。 frm ファイルにはテーブル定義が保存されます。 データファイルはMYD(MYData)です。 インデックスファイルはMYI(MYIndex)の拡張子です。

MyISAM は比較的シンプルなので、効率の点で InnoDB よりも優れています。

MyISAM テーブルはファイルの形式で保存されます。これはクロスプラットフォームのデータ転送に使用できます。MyISAM ストレージを使用すると、多くの手間が省けます

以下に詳細と具体的な実装の違いを示します:

1. InnoDB は FULLTEXT タイプのインデックスをサポートしません。 。

2. InnoDB はテーブル内の特定の行数を保存しません。つまり、テーブルから select count(*) を実行するとき、InnoDB はテーブル全体をスキャンして、存在する行数を計算する必要があります。ただし、MyISAM は単に保存された行数を読み取って出力するだけです。 count(*) ステートメントに where 条件が含まれている場合、2 つのテーブルの操作は同じであることに注意してください。


3. AUTO_INCREMENT 型のフィールドの場合、InnoDB にはこのフィールドのみのインデックスが含まれている必要がありますが、MyISAM テーブルでは他のフィールドとの結合インデックスを確立できます。


4. DELETE FROM テーブルの場合、InnoDB はテーブルを再作成せず、行ごとに削除します。


5. LOAD TABLE FROM MASTER 操作は InnoDB では機能しません。ただし、追加の InnoDB 機能の場合は、まず InnoDB テーブルを MyISAM テーブルに変更します。 (外部キーなど) テーブルは適用されません。
------解決策------------------
innodb+ フルテキストインデックスが必要な場合は、変更するだけですスフィンクス、メインへ 読み取りと書き込みの分離から完了する                                                    

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