推奨学習: mysql ビデオ チュートリアル
記事を始める前に質問させてください: delete inサブクエリ、インデックスは作成されますか??多くのパートナーの第一印象は、インデックスの作成方法を知っているということです。最近、それに関連する生産上の問題が発生しました。この記事では、この問題について全員で話し合い、最適化計画を添付します。
問題の再現
現在 2 つのテーブル
account と # # があると仮定すると、MySQL のバージョンは 5.7
です。 #old_account のテーブル構造は次のとおりです。
CREATE TABLE `old_account` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', `name` varchar(255) DEFAULT NULL COMMENT '账户名', `balance` int(11) DEFAULT NULL COMMENT '余额', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='老的账户表'; CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', `name` varchar(255) DEFAULT NULL COMMENT '账户名', `balance` int(11) DEFAULT NULL COMMENT '余额', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';
実行される SQL は次のとおりです。
delete from account where name in (select name from old_account);実行計画について説明します。
explain
テーブル全体をスキャン
アカウント、次にサブクエリを行ごとに実行して、次のことを確認します。条件は満たされています。明らかに、この実行プランと がインデックス に移動しなかったため、一致しないことが予想されました。
ただし、delete
select に置き換えると、インデックスが使用されます。次のとおりです:
select in
原因分析
select in
サブクエリ ステートメントとdelete in サブクエリ ステートメントの違いは何ですか?
次の SQL を実行して、
explain select * from account where name in (select name from old_account); show WARNINGS;show WARNINGS
最適化後に最終的に実行された SQL を表示できます。結果は次のとおりです:
select `test2`.`account`.`id` AS `id`,`test2`.`account`.`name` AS `name`,`test2` .`account` .`balance` AS `balance`,`test2`.`account`.`create_time` AS `create_time`,`test2`.`account`.`update_time` AS `update_time` from `test2`.` account`
semi join (`test2`.`old_account`)where (`test2`.`account`.`name` = `test2`.`old_account`.`name`)を最適化し、インデックスを使用できるようにサブクエリを結合メソッドに変更したことがわかります。しかし、残念ながら、MySQL はサブクエリのselect
実際の実行中に、MySQL がサブクエリの
delete に対して最適化していませんでした。 最適化計画
では、この問題を最適化するにはどうすればよいでしょうか?上記の分析により、サブクエリの削除をjoin
に変更できることが明らかです。結合メソッドに変更した後、もう一度説明しましょう。
#結合メソッドへの変更は、インデックスを使用できる であることがわかります。完璧なソリューションがこの問題を解決しました。
実際、更新または削除のサブクエリ ステートメントについては、MySQL 公式 Web サイトでも結合メソッドの最適化を推奨しています
実際には、次のように、テーブルにエイリアスを付けることでもこの問題を解決できます。
explain delete a from account as a where a.name in (select name from old_account)

戻って Explain の実行プランを見てみましょう。「Extra」列に
があることがわかります。
LooseScan とは何ですか? 実際、これは semi join subquery
の戦略、実行戦略です。サブクエリが結合に変更されるため、サブクエリ内の削除にインデックスを付けることができます。
LooseScan 戦略が使用され、LooseScan戦略は本質的には semi join subquery の実行戦略です。
したがって、エイリアスを追加すると、サブクエリの削除にインデックスを付けることができるようになります。推奨学習: mysql ビデオ チュートリアル
以上がmysqlでサブクエリの削除がインデックスに行かない問題の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

MySQLdiffersfromotherSQLdialectsinsyntaxforLIMIT,auto-increment,stringcomparison,subqueries,andperformanceanalysis.1)MySQLusesLIMIT,whileSQLServerusesTOPandOracleusesROWNUM.2)MySQL'sAUTO_INCREMENTcontrastswithPostgreSQL'sSERIALandOracle'ssequenceandt

MySQLパーティション化により、パフォーマンスが向上し、メンテナンスが簡素化されます。 1)大きなテーブルを特定の基準(日付範囲など)、2)物理的に独立したファイルに物理的に分割する、3)MySQLはクエリするときに関連するパーティションに焦点を合わせることができます。

mysqlで許可を許可および取り消す方法は? 1。grantallprivilegesondatabase_name.to'username'@'host 'などの許可を付与するために付与ステートメントを使用してください。 2。Revokeallprivilegesondatabase_name.from'username'@'host 'など、Revoke Statementを使用して、許可のタイムリーな通信を確保します。

INNODBは、トランザクションサポートと高い並行性を必要とするアプリケーションに適していますが、Myisamはより多くの読み取りとより少ない書き込みを必要とするアプリケーションに適しています。 1.INNODBは、eコマースおよび銀行システムに適したトランザクションおよび銀行レベルのロックをサポートしています。 2. Myisamは、ブログやコンテンツ管理システムに適した、迅速な読み取りとインデックス作成を提供します。

MySQLには4つのメイン結合タイプがあります:innerjoin、leftjoin、rightjoin、fullouterjoin。 1.InnerJoinは、結合条件を満たす2つのテーブルのすべての行を返します。 2.右のテーブルに一致する行がない場合でも、Leftjoinは左のテーブルのすべての行を返します。 3。右joinはleftjoinに反しており、右のテーブルのすべての行を返します。 4.fullouterjoinは、結合条件を満たしている、または満たさない2つのテーブルのすべての行を返します。

mysqloffersvariousstorageEngines、それぞれのfordifferentusecases:1)Innodbisidealforapplicationsingingidcomplianceanceandhighconcurrency、support transactions andforeignkeys.2)myisamisbestforread-havyworkloads、transactionsupptort.3)

MySQLの一般的なセキュリティの脆弱性には、SQLインジェクション、弱いパスワード、不適切な許可構成、および非合事ソフトウェアが含まれます。 1。SQL注射は、前処理ステートメントを使用することで防ぐことができます。 2。強力なパスワード戦略を強制的に使用することにより、弱いパスワードを回避できます。 3.不適切な許可構成は、ユーザー許可の定期的なレビューと調整を通じて解決できます。 4.未使用のソフトウェアは、MySQLバージョンを定期的にチェックして更新することでパッチを適用できます。

MySQLの遅いクエリを識別することは、遅いクエリログを有効にし、しきい値を設定することで実現できます。 1.スロークエリログを有効にし、しきい値を設定します。 2.スロークエリログファイルを表示および分析し、詳細な分析のためにMySQLDumpSlowやPT-Query-Digestなどのツールを使用します。 3.インデックスの最適化、クエリの書き換え、およびselect*の使用を回避することで、遅いクエリの最適化を実現できます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

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

ホットトピック









