以前の記事基礎となるデータ構造を説明し、MySQLのMySQLの最適化アーティファクトを説明。、我々は通常、いくつかの友人は、SQLの最適化の戦闘は、焼きたて、整理し、まとめるために、SQLの最適化を戦う週末2日間には少し強く促し舞台裏Xiaoqiangだけで、通常の使用の概念を導入または無知に見えると述べた勉強や仕事の経験心に導入されるSQLの最適化の90%が長すぎるとカザフスタンの3つの記事に分けています。
CREATE TABLE `employees` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
`age` int(20) NOT NULL DEFAULT '0' COMMENT '年龄',
`position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
`hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间',
PRIMARY KEY (`id`),
KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';
insert into employees(name,age,position,hire_time) values('LiLei', 22, 'manager', NOW())
insert into employees(name,age,position,hire_time) values('HanMeimei', 23, 'dev', NOW())
insert into employees(name,age,position,hire_time) values('Lucy', 23, 'dev', NOW())
完全な値が一致
インデックスフィールド・タイプはVARCHAR(n)は2バイト文字列の長さ記憶それはUTF-8である場合、次に長さは3N + 2であります
EXPLAIN select * from employees where name='LiLei';
EXPLAIN select * from employees where name='LiLei' AND age = 22;
EXPLAIN select * from employees where name='LiLei' AND age = 22 AND position = 'manager';
最も左のプレフィックスルール
インデックスは、最も左端の接頭辞ルールに、複数列である場合。これは、最初の最前線に左端からクエリを参照し、インデックス内のインデックス列をスキップしません。最も左のプレフィックス規則によると、以下の2つのSQLは、インデックスになりません。
EXPLAIN select * from employees where age = 22 AND position='manager';
EXPLAIN select * from employees where position ='manager';
障害指数
インデックスは、全表スキャンを回しながら、インデックスに何も(コンピューティング、関数、型変換)列が失敗につながるしないでください。
EXPLAIN select * from employees where name='LiLei';
EXPLAIN select * from employees where left(name, 3)='LiLei';
指数の一般的な増加にHire_time:
alter table `employees` ADD INDEX `idx_hire_time`(`hire_time`) USING BTREE;
EXPLAIN select * from employees where date(hire_time) = '2019-08-25';
元の状態の指標を復元
ALTER TABLE `employees` DROP INDEX `idx_hire_time`;
ストレージエンジンは、範囲の条件の右側の列にインデックスを使用することはできません
-- EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';
EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age>22 AND position ='manager';
key_lenには最初の2つのフィールドの名前と年齢、インデックスを使用しないpostitionに、つまり、このインデックスの長さは78である参照してください。
インデックスをカバー
被覆指数(インデックスクエリへのアクセスのみを(インデックス列がクエリの列を含む))を使用するようにしてください、selelctの*文を減らします。
EXPLAIN SELECT name,age,position FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';
条件付きの
MySQLは(!=または<>)、使用中の等しくないインデックスがフルテーブルスキャンにつながるときに使用することはできません
EXPLAIN SELECT * FROM employees WHERE name !='LiLei' ;
分析はnull
、nullのインデックスを使用することはできませんnullではありません
EXPLAIN SELECT * FROM employees WHERE name is null;
以下のような
ワイルドカードは、完成してしまう(「$のABC」)MySQLのインデックステーブルスキャンの失敗を開始したいです
EXPLAIN SELECT * FROM employees WHERE name LIKE '%Lei';
単一引用符インデックスのない文字列の失敗
EXPLAIN SELECT * FROM employees WHERE name ='1000';
EXPLAIN SELECT * FROM employees WHERE name =1000;
単一引用符文字列は、MySQLが文字列の場合、インデックスの故障に変換するカスト根底にある機能を使用しています。
または&あまり使用されています
以下またはクエリ、MySQLは必ずしもインデックスを使用しないでそれを使用するには、MySQL内部オプティマイザは全体の評価に基づいてインデックスを使用するかどうかの要因インデックス比、テーブルサイズの数。
EXPLAIN SELECT * FROM employees WHERE name ='LiLei' or name='HanMeimei';
範囲クエリの最適化
年齢のための単一のインデックス値を追加します。
ALTER TABLE `employees`ADD INDEX `idx_age`(`age`) USING BTREE;
EXPLAIN select * from employees where age > 1 and age <= 2000;
インデックスに行く理由はありません:mysqlの内部オプティマイザは、多くの要因が、比率、テーブルのサイズを取得するかどうかの全体的な評価に基づいてインデックスを使用します。
インデックスを取ることはありません。この例では、インデックスを取るにつながるないことを選択したデータのクエリオプティマイザの単一大量に起因する可能性があります。
最適化方法:大規模な範囲は、小さな複数の範囲に分割することができます。
私は公共の数を懸念していませんよ?
- 以下のように受信することができる[社会的関心Xiaoqiang高度道路の二次元コードの数を終了スイープ。
- 教材:1Tビデオチュートリアル:フロントとリアエンドはJavaweb教育ビデオ、機械学習/ AI教育ビデオ、Linuxシステムのチュートリアル動画、IELTSのビデオチュートリアルをカバー。
- 以上の100冊:含むC / C ++やJava、Pythonプログラミング言語は3冊、LeetCodeの説明Daquanのを見なければなりません。
- ソフトウェアツール:ほとんどのソフトウェアは、ほとんどあなたが道をプログラミングに使用する場合があります含み;
- プロジェクトソース:20件のJavaWebソースプロジェクト。