2. インデックス最適化分析
1- SQL パフォーマンス低下の理由
1. クエリ ステートメントの書き方が悪く、インデックスが構築されていない
2. インデックスの無効化
- 単一の値
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> <span style="color:#0000ff">user</span> <span style="color:#0000ff">where</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">''</span>;
<span style="color:#0000ff">create</span> index idx_user_name <span style="color:#0000ff">on</span> <span style="color:#0000ff">user</span>(name);
</code></span></span>
- 複雑な
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> <span style="color:#0000ff">user</span> <span style="color:#0000ff">where</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">''</span> <span style="color:#0000ff">and</span> email<span style="color:#ab5656">=</span><span style="color:#a31515">''</span>;
<span style="color:#0000ff">create</span> index idx_user_name <span style="color:#0000ff">on</span> <span style="color:#0000ff">user</span>(name, email);
</code></span></span>
3. 関連するクエリの結合が多すぎる (設計上の欠陥または避けられない要件)
4. サーバーチューニングと各種パラメータ設定(バッファリング、スレッド数など)
2-SQL 実行のロード順序
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">SELECT</span> <span style="color:#0000ff">DISTINCT</span>
<span style="color:#ab5656"><</span>select_list<span style="color:#ab5656">></span>
<span style="color:#0000ff">FROM</span>
<span style="color:#ab5656"><</span>left_table<span style="color:#ab5656">></span> <span style="color:#ab5656"><</span>join_type<span style="color:#ab5656">></span>
<span style="color:#0000ff">JOIN</span>
<span style="color:#ab5656"><</span>right_table<span style="color:#ab5656">></span>
<span style="color:#0000ff">ON</span>
<span style="color:#ab5656"><</span>join_condition<span style="color:#ab5656">></span>
<span style="color:#0000ff">WHERE</span>
<span style="color:#ab5656"><</span>where_condition<span style="color:#ab5656">></span>
<span style="color:#0000ff">GROUP</span> <span style="color:#0000ff">BY</span>
<span style="color:#ab5656"><</span>group_by_list<span style="color:#ab5656">></span>
<span style="color:#0000ff">HAVING</span>
<span style="color:#ab5656"><</span>having_condition<span style="color:#ab5656">></span>
<span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span>
<span style="color:#ab5656"><</span>order_by_condition<span style="color:#ab5656">></span>
LIMIT
<span style="color:#ab5656"><</span>limit_number<span style="color:#ab5656">></span>
</code></span></span>
機械読み取り はから始まります
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#880000">1</span> <span style="color:#0000ff">FROM</span> <span style="color:#ab5656"><</span>left_table<span style="color:#ab5656">></span>
<span style="color:#880000">2</span> <span style="color:#0000ff">ON</span> <span style="color:#ab5656"><</span>join_condition<span style="color:#ab5656">></span>
<span style="color:#880000">3</span> <span style="color:#ab5656"><</span>join_type<span style="color:#ab5656">></span> <span style="color:#0000ff">JOIN</span> <span style="color:#ab5656"><</span>right_table<span style="color:#ab5656">></span>
<span style="color:#880000">4</span> <span style="color:#0000ff">WHERE</span> <span style="color:#ab5656"><</span>where_condition<span style="color:#ab5656">></span>
<span style="color:#880000">5</span> <span style="color:#0000ff">GROUP</span> <span style="color:#0000ff">BY</span> <span style="color:#ab5656"><</span>group_by_list<span style="color:#ab5656">></span>
<span style="color:#880000">6</span> <span style="color:#0000ff">HAVING</span> <span style="color:#ab5656"><</span>having_condition<span style="color:#ab5656">></span>
<span style="color:#880000">7</span> <span style="color:#0000ff">SELECT</span>
<span style="color:#880000">8</span> <span style="color:#0000ff">DISTINCT</span> <span style="color:#ab5656"><</span>select_list<span style="color:#ab5656">></span>
<span style="color:#880000">9</span> <span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span> <span style="color:#ab5656"><</span>order_by_condition<span style="color:#ab5656">></span>
<span style="color:#880000">10</span> LIMIT <span style="color:#ab5656"><</span>limit_number<span style="color:#ab5656">></span>
</code></span></span>
要約する
3- 7 つの JOIN 理論
- ケース1の場合
select * from A inner join B on A.key=B.key inner は 、AB のパブリック部分をクエリする必要があることを示します
- ケース2の場合
select * from A left join B on A.key=B.key left left は、 左側のテーブルの AB のすべての公開部分が必須であり、A に固有であることを示します
- ケース3の場合
select * from A right join B on A.key=B.key right right は、 右側のテーブルのすべての AB の公開部分 + B の一意の部分を意味します
- ケース 4 の場合、A を独占する必要があります
select * from A left join B on A.key=B.key B.key が NULL left Leftは 、A のすべての部分 + 左のテーブルの非 AB 公開部分が必要であることを示します
- ケース5B専用
select * from A right join B on A.key=B.key (B.key は NULL) right right は 、右のテーブルのすべての B 所有部分が必須 + 非 AB 公開部分であることを意味します
① 7種類のJOINのSQL記述
準備するには、次のテーブルを作成し、新しいデータを挿入します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> tbl_dept(
id <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
deptName <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">30</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
locAdd <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">40</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
<span style="color:#0000ff">PRIMARY</span> KEY(id)
)ENGINE<span style="color:#ab5656">=</span>INNODB AUTO_INCREMENT<span style="color:#ab5656">=</span><span style="color:#880000">1</span> <span style="color:#0000ff">DEFAULT</span> CHARSET<span style="color:#ab5656">=</span>utf8;
<span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> tbl_emp (
id <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
NAME <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">20</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
deptId <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
<span style="color:#0000ff">PRIMARY</span> KEY (id),
KEY fk_dept_Id (deptId)
#<span style="color:#0000ff">CONSTRAINT</span> <span style="color:#a31515">'fk_dept_Id'</span> <span style="color:#0000ff">foreign</span> key (<span style="color:#a31515">'deptId'</span>) <span style="color:#0000ff">references</span> <span style="color:#a31515">'tbl_dept'</span>(<span style="color:#a31515">'Id'</span>)
)ENGINE<span style="color:#ab5656">=</span>INNODB AUTO_INCREMENT<span style="color:#ab5656">=</span><span style="color:#880000">1</span> <span style="color:#0000ff">DEFAULT</span> CHARSET<span style="color:#ab5656">=</span>utf8;
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'RD'</span>,<span style="color:#880000">11</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'HR'</span>,<span style="color:#880000">12</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'MK'</span>,<span style="color:#880000">13</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'MIS'</span>,<span style="color:#880000">14</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'FD'</span>,<span style="color:#880000">15</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'z3'</span>,<span style="color:#880000">1</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'z4'</span>,<span style="color:#880000">1</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'z5'</span>,<span style="color:#880000">1</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'w5'</span>,<span style="color:#880000">2</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'w6'</span>,<span style="color:#880000">2</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'s7'</span>,<span style="color:#880000">3</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'s8'</span>,<span style="color:#880000">4</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'s9'</span>,<span style="color:#880000">51</span>);
</code></span></span>
実行後の結果:
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_dept;
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+</span>
<span style="color:#880000">5</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#880000">8</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
#这就是为什么需要<span style="color:#0000ff">join</span> <span style="color:#0000ff">from</span>优先级最高,而笛卡尔积查询的太多了
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_dept,tbl_emp;
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+----+------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+----+------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+----+------+--------+</span>
<span style="color:#880000">40</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.04</span> sec)
</code></span></span>
1.内部結合
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+----+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+----+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+----+----------+--------+</span>
<span style="color:#880000">7</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
2.左結合
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">left</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+------+----------+--------+</span>
<span style="color:#880000">8</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
3.右結合
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">right</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id;
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+----+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+----+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+----+----------+--------+</span>
<span style="color:#880000">8</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
4.左結合2
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">left</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id <span style="color:#0000ff">where</span> b.id <span style="color:#0000ff">is</span> <span style="color:#0000ff">null</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+------+----------+--------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
5.右結合2
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">right</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id <span style="color:#0000ff">where</span> a.deptid <span style="color:#0000ff">is</span> <span style="color:#0000ff">null</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+----+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+----+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+----+----------+--------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
6.完全結合
MySQL は完全結合をサポートしていませんが、別の方法で表現できます
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">left</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id
<span style="color:#ab5656">-</span><span style="color:#ab5656">></span> <span style="color:#0000ff">union</span>
<span style="color:#ab5656">-</span><span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">right</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id;
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+------+----------+--------+</span>
<span style="color:#880000">9</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
7.完全結合2
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">left</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id <span style="color:#0000ff">where</span> b.id <span style="color:#0000ff">is</span> <span style="color:#0000ff">null</span>
<span style="color:#ab5656">-</span><span style="color:#ab5656">></span> <span style="color:#0000ff">union</span>
<span style="color:#ab5656">-</span><span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp a <span style="color:#0000ff">right</span> <span style="color:#0000ff">join</span> tbl_dept b <span style="color:#0000ff">on</span> a.deptId <span style="color:#ab5656">=</span> b.id <span style="color:#0000ff">where</span> a.deptId <span style="color:#0000ff">is</span> <span style="color:#0000ff">null</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+------+----------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">------+------+--------+------+----------+--------+</span>
<span style="color:#880000">2</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
4-インデックスとは何ですか
MySQL のインデックスの公式定義は次のとおりです。 インデックス (インデックス) は、MySQL がデータを効率的に取得するのに役立つデータ構造です。インデックスの本質がわかります。インデックスはデータ構造です。
インデックスの目的は、辞書に匹敵するクエリの効率を向上させることです。
「mysql」という単語を検索したい場合は、文字 m を見つけてから、文字 y を下から下に見つけて、SQL の残りの部分を見つける必要があります。索引がない場合は、1 つずつ検索する必要があります。Java で始まる単語を見つけたい場合はどうすればよいですか? あるいは、Oracle で始まる単語はどうでしょうか?
単純に「ソートされた高速検索データ構造」と理解できます。
- 並べ替えられた
- クイック検索
データベース システムは、データに加えて、特定の検索アルゴリズムを満たすデータ構造も維持します。これらのデータ構造は、特定の方法でデータを参照 (ポイント) するため、これらのデータ構造上に高度な検索アルゴリズムを実装できます。このデータ構造はインデックスです。次の図は、可能なインデックス作成方法の例です。
左側はデータ テーブルで、2 つの列と 7 つのレコードがあり、一番左のテーブルはデータ レコードの物理アドレスです。
Col2 の検索を高速化するために、右側に示す二分探索ツリーを維持できます。各ノードにはインデックス キー値と、対応するデータ レコードの物理アドレスへのポインタが含まれているため、二分検索を使用できます。一定の複雑さの範囲内で、条件を満たすレコードを迅速に取得するために、対応するデータを取得します。
要約すると、なぜインデックス検索が高速になるのでしょうか? 二分探索ツリーを使用してクエリを実行すると、逐次走査よりも確実に高速になることを考えてください。一般に、インデックス自体も非常に大きく、すべてをメモリに保存することは不可能であるため、インデックスはインデックス ファイルの形式でディスクに保存されることがよくあります。
指定されていない場合、通常参照するインデックスは、B ツリー (多方向検索ツリー、必ずしもバイナリである必要はありません) によって編成されたインデックスを指します。このうち、クラスター化インデックス、セカンダリ インデックス、カバリング インデックス、複合インデックス、プレフィックス インデックス、およびユニーク インデックスはすべてデフォルトで B+ ツリー インデックスを使用し、総称してインデックスと呼ばれます。もちろん、B+ツリー型のインデックス以外にもハッシュインデックスなどもあります。
1 つの注意事項:
一般に、企業では、データが削除された場合、このレコードの active が false に変更されるだけです。サービス層を呼び出す削除の多くは、実際には update であり、これは論理的に削除されたとしか言えませんが、基礎となるデータベースのレコードは引き続き保持されます。理由の 1 つは、1 つはデータ分析用で、もう 1 つはインデックスです (データが削除され、その位置が固定されなくなると、インデックスが不正確になる可能性があります)。データが頻繁に増加および変更されると、二分探索木は不正確になります。(インデックスを再度再構築するだけです)。
①インデックスのメリット・デメリット
- アドバンテージ
大学図書館によって構築された書誌インデックスと同様に、データ検索の効率が向上し、データベースの IO コストが削減されます。
インデックス列を使用してデータを並べ替えると、データの並べ替えコストが削減され、CPU 消費量が削減されます。
- 不利益
実際、インデックスはテーブルでもあり、主キーとインデックス フィールドを格納し、エンティティ テーブルのレコードをポイントするため、インデックス列もスペースを占有します(スペースを占有します)。
インデックスによりクエリの速度は大幅に向上しますが、テーブルの INSERT、UPDATE、DELETE などのテーブルの更新速度は低下します。MySQL はテーブルを更新する際にデータの保存だけでなくインデックスファイルも保存する必要があるため、インデックスカラムを追加したフィールドが更新されるたびに、更新によるキー値変更後のインデックス情報が調整されます。
インデックス作成は効率を向上させるための 1 つの要素にすぎません。MySQL に大量のデータを含むテーブルがある場合は、最適なインデックスの調査と構築、またはクエリの最適化に時間を費やす必要があります。
- 要約する
インデックス、時間とスペースの交換。
② インデックス分類とインデックス構築コマンド文
MySQL インデックスの分類:
- 単一値インデックス: つまり、インデックスには 1 つの列のみが含まれ、テーブルには複数の単一列インデックスを含めることができます。(テーブル上のインデックスは 5 つ以下にすることをお勧めします。複合インデックスが推奨されます)
- 一意のインデックス: インデックス列の値は一意である必要がありますが、NULL 値も許可されます。
- 複合インデックス: つまり、インデックスには複数の列が含まれます。
- 基本的な構文:
- 作成する
- CREATE [UNIQUE] INDEX インデックス名 ON mytable(columnName(length));
- ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnName(length));
- 消去
- DROP INDEX [インデックス名] ON mytable;
- チェック
- SHOW INDEX FROM テーブル名
- alter コマンドを使用します - データ テーブル インデックスを追加するには 4 つの方法があります
- ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);:このステートメントは主キーを追加します。これは、インデックス値が一意である必要があり、NULL にすることはできないことを意味します。
- ALTER TABLE tbl name ADD UNIQUE index_name (column_list);: このステートメントによって作成されるインデックスの値は一意である必要があります (NULL を除き、NULL は複数回出現する可能性があります)。
- ALTER TABLE tbl_name ADD INDEX Index_name (column_list);: 共通インデックスを追加します。インデックス値は複数回出現できます。
- ALTER TABLE tbl_name ADD FULLTEXT Index_name (column_list): このステートメントは、フルテキスト インデックス作成のインデックスを FULLTEXT として指定します。
- 作成する
③インデックスの構造と検索原理
MySQLのインデックス構造
- Bツリーインデックス
- ハッシュインデックス
- 全文 全文インデックス
- R ツリー インデックス
BTree インデックスの検索原理
初期化の概要
b+ ツリー、ディスク ブロックと呼ばれる水色のブロック。各ディスク ブロックには複数のデータ項目 (濃い青で表示) とポインター (黄色で表示) が含まれていることがわかります。たとえば、ディスク ブロック 1 にはデータ項目 17 と 35 が含まれています。 、ポインタ P1、P2、P3 を含みます。
P1 は 17 未満のディスク ブロックを表し、P2 は 17 ~ 35 のディスク ブロックを表し、P3 は 35 より大きいディスク ブロックを表します。
実際のデータはリーフ ノード、つまり3、5、9、10、13、15、28、29、36、60、75、79、90、99 に存在します。
非リーフ ノードは実際のデータを格納せず、検索方向をガイドするデータ項目のみを格納します。17 や 35 などは実際にはデータ テーブルに存在しません。(参考比較値として)
検索プロセス
データ項目 29 を検索する場合、最初にディスク ブロック 1 がディスクからメモリにロードされ、この時点で IO が発生します。メモリ内で二分探索を使用して、29 が 17 ~ 35 の間にあることを確認し、ディスク ブロック 1 の P2 ポインタをロックします。メモリ時間は (ディスク IO と比較して) 非常に短いため、無視できます。ディスク ブロック 1 の P2 ポインタが使用されます。ディスク ブロック 3 がディスクからメモリにロードされ、2 番目の IO が発生します。29 は 26 と 30 の間にあり、ディスク ブロック 3 の P2 ポインタはロックされ、ディスク ブロック8 がポインタを介してメモリにロードされ、3 番目の IO が発生し、同時にメモリがバイナリ検索で 29 を見つけてクエリを終了し、合計 3 回の IO が行われます。木は短いほど良い
実際の状況では、3 層の b+ ツリーは数百万のデータを表すことができます。数百万のデータ ルックアップに 3 つの IO だけが必要な場合、パフォーマンスは大幅に向上します。インデックスがない場合、各データ項目には 1 つの IO が必要で、合計何百万もの IO が必要なので、明らかにコストが非常に高くなります。
④どのような状況でインデックスが適しているのか
- 主キーにより一意のインデックスが自動的に作成されます
- クエリ条件として頻繁に使用されるフィールドにはインデックスを作成する必要があります
- クエリ内の他のテーブルに関連付けられたフィールド、外部キー関係のインデックスが作成されます
- 頻繁に更新されるフィールドは、更新のたびにレコードが更新されるだけでなくインデックスも更新されるため、インデックスの作成には適していません。
- Where 条件で使用されないフィールドにはインデックスは作成されません
- 単一キー/複合インデックスの選択、誰が? (高い同時実行性で複合インデックスを作成するのは 10 人)
- クエリ内の並べ替えられたフィールド。並べ替えられたフィールドがインデックスを通じてアクセスされる場合、並べ替え速度が大幅に向上します (インデックスは取得 + 並べ替えです)。
- クエリ内の統計フィールドまたはグループ化フィールド
⑤インデックス作成に適さない状況とは
- テーブルのレコードが少なすぎます
- 頻繁に追加、削除、変更が行われるテーブル (クエリ速度は向上しますが、更新効率が低下するため構築されません。フィールドだけでなく、対応するインデックス情報も更新する必要があります)
- データが繰り返し均等に分散されているテーブル フィールド。そのため、最も頻繁にクエリされ、最も頻繁に並べ替えられたデータ列のみにインデックスを付ける必要があります。列に多くの重複が含まれている場合、インデックスを作成しても実質的な効果はほとんどないことに注意してください。
テーブルに 100,000 行のレコードがあり、フィールド A に T と F の 2 つの値しかなく、各値の分布確率が約 50% である場合、このテーブルのフィールド A にインデックスを付けても、一般にクエリは改善されません。データベースの速度。
インデックスの選択性は、テーブル内のレコード数に対するインデックス付き列内の個別の値の数の比率です。テーブルに 2000 個のレコードがあり、テーブルのインデックス列に 1980 個の異なる値がある場合、このインデックスの選択性は 1980/2000=0.99 になります。インデックスの選択性が 1 に近づくほど、インデックスの効率が高くなります。
5-パフォーマンス分析の前提知識
MySQLクエリオプティマイザー
MySQL には SELECT ステートメントの最適化を担当するオプティマイザー モジュールがあり、その主な機能は、収集された統計情報を計算および分析することによって、クライアントから要求されたクエリに最適な実行プラン (最適なデータ取得方法を考慮) を提供することです。ただし、必ずしも DBA がそれが最適であると考えるわけではなく、この部分が最も時間がかかります)
クライアントが MySQL からクエリをリクエストすると、コマンド パーサー モジュールはリクエストの分類を完了し、それを SELECT として区別して MySQL クエリ オプティマイザーに転送します。MySQL クエリ オプティマイザーはまずクエリ全体を最適化し、いくつかの定数式のバジェットを直接処理します。定数値に変換されます。また、不要な条件や明白な条件の削除、構造の調整など、Query のクエリ条件を簡略化して変換します。次に、クエリ内のヒント情報 (存在する場合) を分析して、表示されたヒント情報によってクエリの実行計画を完全に決定できるかどうかを確認します。ヒントがない場合、またはヒント情報が実行計画を完全に決定するのに十分でない場合は、関連するオブジェクトの統計情報を読み取り、クエリに従って対応する計算と分析を記述し、最終的な実行計画を作成します。
一般的な MySQL のボトルネック
- CPU: CPU の飽和は通常、データがメモリにロードされるとき、またはディスクから読み取られるときに発生します。
- IO: ディスク I/O ボトルネックは、ロードされたデータがメモリ容量よりもはるかに大きい場合に発生します。
- サーバー ハードウェアのパフォーマンスのボトルネック: システムのパフォーマンス ステータスを表示するには、top、free、iostat、および vmstat
①Explainの使い方の紹介
Explain とは: EXPLAIN キーワードを使用してオプティマイザをシミュレートして SQL クエリ ステートメントを実行し、MySQL が SQL ステートメントをどのように処理するかを確認します。クエリ ステートメントまたはテーブル構造のパフォーマンスのボトルネックを分析します。
何ができますか
- テーブルの読み取り順序
- データ読み取り操作の操作タイプ
- 使用できるインデックス
- 実際に使用されるインデックス
- テーブル間の参照
- オプティマイザによってクエリされるテーブルあたりの行数
遊び方
- Explain + SQL ステートメント
- 実行計画に含まれる情報
- | ID | 選択タイプ | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | 参照 | 行 | フィルタリング済み | 番外編 |
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5 <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6 <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7 <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8 <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9 <span style="color:#ab5656">|</span> <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#880000">8</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.01</span> sec)
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp;
<span style="color:#ab5656">+</span><span style="color:#008000">----+-------------+---------+------+---------------+------+---------+------+------+-------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> select_type <span style="color:#ab5656">|</span> <span style="color:#0000ff">table</span> <span style="color:#ab5656">|</span> type <span style="color:#ab5656">|</span> possible_keys <span style="color:#ab5656">|</span> key <span style="color:#ab5656">|</span> key_len <span style="color:#ab5656">|</span> <span style="color:#0000ff">ref</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">rows</span> <span style="color:#ab5656">|</span> Extra <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-------------+---------+------+---------------+------+---------+------+------+-------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> SIMPLE <span style="color:#ab5656">|</span> tbl_emp <span style="color:#ab5656">|</span> <span style="color:#0000ff">ALL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#0000ff">NULL</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-------------+---------+------+---------------+------+---------+------+------+-------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.01</span> sec)
</code></span></span>
②explainのidの紹介
クエリ内で選択句または操作テーブルが実行される順序を示す、一連の数値を含む選択クエリのシリアル番号。
3 つの条件:
-
IDは同じで、実行順序は上から下へ
-
idが異なります。サブクエリの場合はidの通し番号が大きくなります。idの値が大きいほど優先度が高く、早く実行されます。
-
IDは同じであり、異なっていて、同時に存在します。
IDは同じで、実行順序は上から下へ
idが異なります。サブクエリの場合はidの通し番号が大きくなります。idの値が大きいほど優先度が高く、早く実行されます。
IDは同じであり、異なっていて、同時に存在します。
まとめ
- ID が同じ場合、それらはグループとみなされ、上から下に順番に実行されます。
- すべてのグループにおいて、id 値が大きいほど優先順位が高く、より早く実行されます。 Derivation = DERIVED (つまり、仮想テーブル)。driven2 の 2 は、テーブルを拡張した仮想テーブルであることを示します。 ID 2
- ID が大きいほど、クエリが早く実行されます。
③select_typeとexplainのテーブルの紹介
select_type:クエリのタイプ。主に、通常のクエリ、結合クエリ、サブクエリなどの複雑なクエリを区別するために使用されます。
select_types とは何ですか?
- SIMPLE - サブクエリや UNION を含まない単純な選択クエリ。
- PRIMARY -クエリに複雑なサブパートが含まれている場合、最も外側のクエリがマークされます。(卵の殻に相当し、最後にロードされます)
- SUBQUERY - サブクエリは SELECT または WHERE リストに含まれます。(卵黄を先に入れます)
- DERIUED - FROM リストに含まれるサブクエリは DERIVED (派生) としてマークされます。MySQL はこれらのサブクエリを再帰的に実行し、結果を一時テーブルに置きます。
- UNION - 2 番目の SELECT が UNION の後に出現する場合、UNION としてマークされます。UNION が FROM 句のサブクエリに含まれる場合、外側の SELECT は DERIVED としてマークされます。
- UNION RESULT - UNION テーブルから結果を取得するための SELECT。
table:この行のデータがどのテーブルに関するものであるかを表示します。
④エクスプレインの種類の紹介
アクセスタイプの配置
type は、比較的重要な指標であるアクセス タイプを示します。結果の値は、最良から最悪の順に表示されます。
システム > const > eq_ref > ref > フルテキスト > ref_or_null > インデックスマージ > ユニークサブクエリ > インデックスサブクエリ > 範囲 > インデックス >ALL
最良から最悪の順: system>const>eq_ref>ref>range>index>ALL
一般に、クエリが少なくとも範囲レベルに到達することを保証する必要があり、ref に到達するのが最善です。
詳細な説明
- システム
テーブルには 1 行のレコード (システム テーブルと同じ) しかありません。これは const 型の特別な列であり、通常は表示されず、これも無視できます。(テーブルごとに 1 つのレコード)
- 定数
インデックスが 1 回見つかったことを示し、const を使用して主キーまたは一意のインデックスを比較します。データの 1 行のみが一致するため、主キーが where リストに配置されている場合、MySQL はクエリを定数にすぐに変換できます。次のシステムは、一致するクエリの一時テーブルとして 1 つのレコードのみが返されるためです。
- eq_ref
一意のインデックス スキャン。インデックス キーごとに、テーブル内の 1 つのレコードのみがそれに一致します。主キーまたは一意のインデックス スキャンに共通です。
- 参照
単一の値に一致するすべての行を返す非固有インデックス スキャンは、本質的には単一の値に一致するすべての行を返すインデックス アクセスですが、複数の適格な行が見つかる場合があるため、検索とスキャンを組み合わせて使用する必要があります。
- 範囲
インデックスを使用して行を選択し、指定された範囲の行のみを取得します。キー列には、どのインデックスが使用されているかが表示されます。通常、where ステートメントには between、<、>、in などのクエリがあります。この範囲スキャンのインデックス スキャンは、インデックス全体をスキャンすることなく、インデックス内の 1 つのポイントで開始し、別のポイントで終了するだけで。
- 索引
フル インデックス スキャン、インデックスと ALL の違いは、インデックス タイプがインデックス ツリーのみをスキャンすることです。通常、インデックス ファイルはデータ ファイルより小さいため、これは通常 ALL より高速です (つまり、all と Index は両方ともテーブル全体を読み取りますが、インデックスはインデックスから読み取り、all はハード ディスクから読み取ります)。
- 全て
フル テーブル スキャン。テーブル全体を走査して、一致する行を見つけます。
備考: 一般に、クエリが少なくとも range レベルに到達することを確認する必要があり、ref レベルに到達することが最善です。
⑤ possible_keys とキーの紹介を説明する
possible_keys
このテーブルに適用できるインデックスを 1 つ以上表示します。クエリに関係するフィールドにインデックスがある場合、そのインデックスはリストされますが、クエリで実際に使用されるとは限りません。
鍵
インデックスが使用されるかどうか。複数のインデックスの場合、MySQL によってどのインデックスが使用されるか。
実際に使用するインデックス。NULL の場合、インデックスは使用されません
クエリでカバリング インデックスが使用されている場合、インデックスとクエリの選択フィールドが重複します。
⑥ Explain の key_len の紹介
インデックスで使用されるバイト数を示します。これは、クエリで使用されるインデックスの長さを計算するために使用できます。長さが短いほど、精度を損なうことなく良好になります。
key_len によって表示される値は、インデックス フィールドの可能な最大長であり、実際に使用される長さではありません。つまり、key_len はテーブル定義に従って計算され、テーブルから取得されるものではありません。
⑦説明文の紹介
可能な場合、インデックスのどの列が使用されるかを示す定数。インデックス付き列の値を検索するためにどの列または定数が使用されるか。
key_len から、 t1 テーブルの idx_col1_col2 インデックスが完全に使用されていること、col1 が t2 テーブルのcol1 に一致し、col2 が定数、つまり 'ac' に一致していることがわかります。
共有ライブラリの t2 テーブルの Col1。
クエリ内の他のテーブルに関連付けられたフィールド、および外部キー関係にはインデックスが付けられます。
⑧行説明の導入
テーブルの統計とインデックスの選択に基づいて、必要なレコードを見つけるために読み取る必要がある行数を大まかに見積もります。(オプティマイザによってクエリされた各テーブルの行数)
⑨Explainの番外編紹介
他の列には収まらない重要な追加情報が含まれます。
①ファイルソート使用で 九死に一生を得た
これは、mysql がテーブル内のインデックス順序に従って読み取るのではなく、外部インデックスを使用してデータを並べ替えることを意味します。MySQLではインデックスではできないソート操作を「ファイルソート」といいます \Gは出力にキー値表示方式を使うことを意味します
作成したインデックスは部分的にのみ使用します。インデックスはクエリ時に部分的にのみ使用されますが、並べ替えには使用されません。
次の 2 つを比較してください。上記では、col1 とcol3 のみが使用されており、真ん中のcol2 が消えています。後者は、col1、col2、col3 を使用しています。
インデックスの構築と修復された階段を比較すると、col1、col2、col3 では 3 本の道路が建設されています。
上の部分は、内部でもう 1 回投げて、もう 1 つの仕分けステップを自分で実行するのと同じですが、下の部分は段階的に実行されますが、明らかに下の部分の方が上の部分よりも効率的です。
②Using temporary 必死
一時テーブルを使用して中間結果を保存すると、MysQL はクエリ結果を並べ替えるときに一時テーブルを使用します。並べ替え順序とグループ化クエリのグループ化でよく発生します。
Order by クエリと group by クエリは、SQL を遅くする原因となることがよくあります。
上部: 複合インデックス (col1、col2) が確立されていますが、col2 のみが使用されており、1 階はなく 2 階に直接接続されているため、処理には一時テーブルとファイルのソートが必要です。
次の部分: Col1 と Col2 が確立され、col1 と Col2 も使用されます。
order by および group by group クエリは、確立されたインデックスと同じ順序であることが望ましいです。
③インデックスの利用
対応する選択操作がカバー インデックス (Covering Index) を使用してテーブルのデータ行へのアクセスを回避し、効率が良いことを示します。
where を同時に使用する場合は、インデックスを使用してインデックス キー値の検索を実行することを示します。
同時に where を使用しない場合は、検索アクションを実行するのではなく、インデックスがデータの読み取りに使用されることを示します。
where を同時に使用する場合は、インデックスを使用してインデックス キー値の検索を実行することを示します。
Covering Index(カバーリングインデックス)とは、インデックスカバレッジのことを言います。
1. 構築されたインデックスは複合インデックス (1、2、3) です。
2. select * を記述しませんでした。select 1 2 3 または select 1 2 をチェックしただけです。これはカバーインデックスです。
方法 1 を理解する: 選択されたデータ列は、データ行を読み取ることなく、インデックスからのみ取得できます。MySQL は、インデックスに従ってデータ ファイルを再度読み取ることなく、インデックスを使用して選択リスト内のフィールドを返すことができます。言い換えれば、構築されたインデックスによって上書きされる列をクエリします。
方法 2 を理解する: インデックス付けは行を効率的に検索する方法ですが、一般的なデータベースではインデックスを使用して列内のデータを検索することもできるため、行全体を読み取る必要はありません。結局のところ、インデックス リーフ ノードにはインデックス付けされたデータが格納され、インデックスを読み取ることで目的のデータが取得できる場合は、行を読み取る必要はありません。クエリ結果を満たすデータを含む (またはカバーする) インデックスは、カバー インデックスと呼ばれます。
知らせ:
カバリングインデックスを使用する場合は、必ず選択リストから必要な列のみを取り出してください。* は選択できません。
すべてのフィールドが一緒にインデックス付けされると、インデックス ファイルが大きくなりすぎ、クエリのパフォーマンスが低下します。
カバリングインデックスとは何ですか?
カバリング インデックスは、 クエリに必要なすべての列、場合によってはそれ以上の列を含むインデックスです。
たとえば、これは次のとおりです。
SELECT *
FROM テーブル名
WHERE 条件通常、 criteriaを使用して取得する行の解決を高速化するためにインデックスを使用します が、行を取得するためにテーブル全体にアクセスします。
ただし、インデックスに列 column1、column2 、 column3が含まれている場合、この SQL は次のようになります。
SELECT 列 1、列 2
FROM テーブル名
WHERE 条件また、特定のインデックスを使用して取得する行の解決を高速化できる場合、そのインデックスには関心のある列の値がすでに含まれているため、行を取得するためにテーブルに移動する必要はありません。ですが、インデックスから直接結果を生成することもできます。
これは、一般的なクエリが行を解決するために 1 ~ 2 列を使用し、通常はさらに 1 ~ 2 列を追加する場合にも使用できます。これらの追加の列を追加すると有益な場合があります (列がすべて同じである場合)。 ) をインデックスに追加することで、クエリ プロセッサがインデックス自体からすべてを取得できるようになります。
④どこで使うか
フィルタリングが使用される場所を示します。
⑤ジョインバッファの利用
接続キャッシュが使用されます。
⑥無理なところ
where 句の値は常に false であり、タプルを取得するために使用することはできません。
⑦最適化されたテーブルを選択する(あまり使用されない)
GROUP BY 句がない場合、MIN/MAX 演算はインデックスに基づいて最適化され、COUNT(*) 演算は MyISAM ストレージ エンジン用に最適化され、計算のために実行段階まで待つ必要がなく、最適化はクエリ実行プラン生成の段階で完了します。
⑧distinct(あまり使われない)
個別の操作を最適化し、最初に一致するタプルを見つけた後は同じ値の検索を停止します。
⑩ウォームアップケースの説明
最初の行 (実行シーケンス 4): id 列は 1 で、それが共用体の最初の選択であることを示し、select_type 列のプライマリはクエリが外部クエリであることを示し、テーブル列は次のようにマークされます。このうち、derived3 の 3 は、クエリが 3 番目の選択クエリ、つまり ID 3 の選択から派生していることを意味します。【d1.nameを選択...】
2 行目 (実行シーケンス 2): ID は 3 で、クエリ全体の 3 番目の選択の一部です。fromにクエリが含まれているので派生します。【other_column=''のt1からid,nameを選択】
3 行目 (実行シーケンス 3): 選択リストのサブクエリ select_type は subquery で、クエリ全体の 2 番目の選択です。【t3からidを選択】
4 行目 (実行シーケンス 1): select_type は Union で、4 番目の select が Union 内の 2 番目の select であり、最初に[select name, id from t2]を実行することを示します。
5 行目 (実行シーケンス 5): ユニオン一時テーブルから行を読み取る段階を表し、テーブル列の <union1,4> は、1 番目と 4 番目の選択の結果を使用してユニオン演算が実行されることを示します。[2つの結果の結合演算]
6- インデックス最適化のケース
① インデックス単一テーブル最適化ケース
テーブルSQLの作成
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> article(
id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> <span style="color:#0000ff">PRIMARY</span> KEY AUTO_INCREMENT,
author_id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
category_id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
views <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
comments <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
title <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">255</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
content TEXT <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>
);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> article(author_id,category_id,views,comments,title,content)
<span style="color:#0000ff">VALUES</span>
(<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#a31515">'1'</span>,<span style="color:#a31515">'1'</span>),
(<span style="color:#880000">2</span>,<span style="color:#880000">2</span>,<span style="color:#880000">2</span>,<span style="color:#880000">2</span>,<span style="color:#a31515">'2'</span>,<span style="color:#a31515">'2'</span>),
(<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#880000">3</span>,<span style="color:#880000">3</span>,<span style="color:#a31515">'3'</span>,<span style="color:#a31515">'3'</span>);
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> article;
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+-------------+-------+----------+-------+---------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> author_id <span style="color:#ab5656">|</span> category_id <span style="color:#ab5656">|</span> views <span style="color:#ab5656">|</span> comments <span style="color:#ab5656">|</span> title <span style="color:#ab5656">|</span> content <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+-------------+-------+----------+-------+---------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+-------------+-------+----------+-------+---------+</span>
<span style="color:#880000">3</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
- category_id が 1 で、コメントが 1 より大きい場合に、 最も多くのビュー(1 つだけ)を持つarticle_id をクエリします。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> id, author_id <span style="color:#0000ff">FROM</span> article <span style="color:#0000ff">WHERE</span> category_id <span style="color:#ab5656">=</span> <span style="color:#880000">1</span> <span style="color:#0000ff">AND</span> comments <span style="color:#ab5656">></span> <span style="color:#880000">1</span> <span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span> views <span style="color:#0000ff">DESC</span> LIMIT <span style="color:#880000">1</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> author_id <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
結論: 明らかに、タイプは ALL であり、これは最悪のケースです。ファイルソートの使用はエクストラでも登場しましたが、これも最悪のケースです。最適化は必須です。
最適化を開始する
新しいインデックスの作成 + インデックスの削除
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">create</span> index idx_article_ccv <span style="color:#0000ff">on</span> article(category_id,comments,views);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.03</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
または、次の SQL を使用してインデックスを作成します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">ALTER</span> <span style="color:#0000ff">TABLE</span> <span style="color:#a31515">'article'</span> <span style="color:#0000ff">ADD</span> INDEX idx_article_ccv ( <span style="color:#a31515">'category_id , '</span>comments<span style="color:#a31515">', '</span>views<span style="color:#a31515">' );
</span></code></span></span>
作成後の効果
Extra にはファイルソートの使用がまだあり、このインデックスを作成してもほとんど効果がありません。
コメント > 1 がコメント = 1 に置き換えられた場合、ファイルソートの使用は消える可能性がありますが、トピックの要件を満たしていません。
このインデックスを作成してもあまり役に立たないので、削除してください。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">DROP</span> INDEX idx_article_ccv <span style="color:#0000ff">ON</span> article;
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
理由
タイプは範囲になりますが、許容範囲です。ただし、追加で filesort を使用することは依然として受け入れられません。
しかし、インデックスはすでに構築されているのに、なぜそれが役に立たないのでしょうか?
これは、BTree インデックスの動作原理によると次のとおりです。
- category_idを最初に並べ替えます
- 同じ category_id が見つかった場合、コメントを並べ替えます
- 同じコメントが見つかった場合、ビューは並べ替えられます。
コメント フィールドがジョイント インデックスの途中にある場合、コメント > 1 の条件が範囲値 (いわゆるレンジ) であるため、範囲以降のインデックスは無効になり、MySQL はそのインデックスを使用して後続のインデックスを取得できません。ビュー部分、つまり範囲タイプのクエリフィールドに続くインデックスが無効です。
改善する
前回作成したインデックスと比較して、今回はコメントフィールドのインデックスは作成されません。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">create</span> index idx_article_cv <span style="color:#0000ff">on</span> article(category_id, views);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
もう一度説明してください
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> id, author_id <span style="color:#0000ff">FROM</span> article <span style="color:#0000ff">WHERE</span> category_id <span style="color:#ab5656">=</span> <span style="color:#880000">1</span> <span style="color:#0000ff">AND</span> comments <span style="color:#ab5656">></span> <span style="color:#880000">1</span> <span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span> views <span style="color:#0000ff">DESC</span> LIMIT <span style="color:#880000">1</span>;
</code></span></span>
型が ref に変更され、Extra のファイルソートの使用がなくなり、非常に理想的な結果になっていることがわかります。
要約:
範囲タイプのクエリ フィールドにはインデックスを作成しないようにしてください (一般に、クエリ between、<、>、in などは where ステートメントに表示されます)。
②2つのテーブルのインデックス最適化の場合
新しいSQL
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> class(
id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
card <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
<span style="color:#0000ff">PRIMARY</span> KEY(id)
);
<span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> book(
bookid <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
card <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
<span style="color:#0000ff">PRIMARY</span> KEY(bookid)
);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
</code></span></span>
作成後の結果:
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> class;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> card <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> <span style="color:#880000">9</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">9</span> <span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">10</span> <span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">16</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">19</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">20</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">21</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+</span>
<span style="color:#880000">21</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> book;
<span style="color:#ab5656">+</span><span style="color:#008000">--------+------+</span>
<span style="color:#ab5656">|</span> bookid <span style="color:#ab5656">|</span> card <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">--------+------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">16</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">9</span> <span style="color:#ab5656">|</span> <span style="color:#880000">10</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">10</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">9</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">16</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">19</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">20</span> <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">--------+------+</span>
<span style="color:#880000">20</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
Explain 分析を開始します。2 つのテーブルには主キーと外部キーがあります。どのテーブルにインデックスを追加する必要がありますか?
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card;
</code></span></span>
すべてのタイプはすべてであり、最適化する必要があり、クエリされるレコードの数は 21+20 です。
book.card のインデックスを作成する
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">ALTER</span> <span style="color:#0000ff">TABLE</span> `book` <span style="color:#0000ff">ADD</span> INDEX Y(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
もう一度分析を説明します
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card;
</code></span></span>
2 行目の型が ref に変更され、行数が減少しているため、最適化がより明確になっていることがわかります。これは、左結合機能によって決定されます。LEFT JOIN の特徴は、左側のテーブルにすべてが含まれていることです。条件は右側のテーブルから行を検索する方法を決定するために使用され、左側にはそれらの条件が必要であるため、右側がキー ポイントであり、インデックスを確立する必要があります。右の表にあります。
削除する book.card のインデックスを作成する
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">drop</span> index y <span style="color:#0000ff">on</span> book;
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.02</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
class.card のインデックスを作成する
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">ALTER</span> <span style="color:#0000ff">TABLE</span> `class` <span style="color:#0000ff">ADD</span> INDEX Y(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
もう一度分析を説明します
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card;
</code></span></span>
右側が重要なポイントであることがわかります。最適化するには、右側のテーブルにインデックスを構築する必要があります。
次に、右結合 RIGHT JOIN クエリに切り替えます。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">right</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card;
</code></span></span>
左側への変更が重要なポイントであり、最適化するには、左側のテーブルにインデックスを構築する必要があります。
まとめ
2 つのテーブルのインデックスが最適化され、右側のテーブルを左結合してインデックスを構築し、左のテーブルを右結合してインデックスを構築します。
③インデックス3テーブル最適化ケース
新しいSQL
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> phone(
phoneid <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
card <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
<span style="color:#0000ff">PRIMARY</span> KEY(phoneid)
)ENGINE<span style="color:#ab5656">=</span>INNODB;
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
</code></span></span>
後遺症
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> phone;
<span style="color:#ab5656">+</span><span style="color:#008000">---------+------+</span>
<span style="color:#ab5656">|</span> phoneid <span style="color:#ab5656">|</span> card <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">---------+------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">10</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">9</span> <span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">10</span> <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span> <span style="color:#880000">19</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">16</span> <span style="color:#ab5656">|</span> <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">19</span> <span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">20</span> <span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">---------+------+</span>
<span style="color:#880000">20</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
前のセクションの book テーブルと class テーブルを再利用し、元のインデックスを削除します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">show</span> index <span style="color:#0000ff">from</span> class;
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">drop</span> index y <span style="color:#0000ff">on</span> class;
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.02</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">show</span> index <span style="color:#0000ff">from</span> book;
</code></span></span>
Phone.card と book.card の新しいインデックスを作成します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">alter</span> <span style="color:#0000ff">table</span> `phone` <span style="color:#0000ff">add</span> index z(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">alter</span> <span style="color:#0000ff">table</span> `book` <span style="color:#0000ff">add</span> index y(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
Explain 3 つのテーブルの接続 3 つのテーブルが少なくとも 2 回関連付けられています。どのテーブルにインデックスを構築する必要がありますか?
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> phone <span style="color:#0000ff">ON</span> book.card <span style="color:#ab5656">=</span> phone.card;
</code></span></span>
最後の 2 行の型は両方とも ref であり、合計行は適切に最適化されており、効果は良好です。したがって、頻繁にクエリを実行する必要があるフィールドにインデックスを設定するのが最善です。
結論は
Join ステートメントの最適化
Join ステートメント内の NestedLoop のループの総数を最小限に抑えます (結合しすぎたりネストしたりしないでください): 「大きな結果セットを駆動するには、常に小さな結果セットを使用します」。
NestedLoop の内部ループの最適化を優先して、Join ステートメントのドリブン テーブルの結合条件フィールドにインデックスが作成されていることを確認します。
駆動テーブルの結合条件フィールドにインデックスが作成されることが保証できず、メモリ リソースが十分である場合は、(my.cnf ファイル内の) JoinBuffer の設定をあまりケチらないでください。
7- インデックスの無効化
インデックス失敗のさまざまな理由: (回避する必要があります)
- フルバリューマッチのお気に入り
- 最左プレフィックス ルール - 複数の列にインデックスが付けられている場合は、一番左のプレフィックス ルールに従います。これは、クエリがインデックスの先頭の左端の列から開始され、複合インデックスの中央の列をスキップしないことを意味します。
- インデックス列に対して操作 (計算、関数、(自動または手動) 型変換) を行わないと、インデックスが失敗し、テーブル全体のスキャンに切り替わります。
- ストレージ エンジンは、インデックス内の範囲条件の右側にある列を使用できません。
- カバリング インデックス (インデックスのみにアクセスするクエリ (インデックス列はクエリ列と一致する)) を使用し、select * を減らしてみます。
- Mysql は等しくない (!= または <>) を使用するとインデックスを使用できず、テーブル全体のスキャンが発生します。
- null である場合、null でない場合もインデックスは使用できません。
- like はワイルドカード ('%abc...') で始まり、mysql インデックスの失敗はテーブル全体のスキャン操作になります。
- 一重引用符のないインデックスは文字列に対して無効です。
- または控えめに使用すると、接続に使用するとインデックスが失敗します。
①全値が私のお気に入りと一致します
新しいSQL
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> staffs(
id <span style="color:#a31515">INT</span> <span style="color:#0000ff">PRIMARY</span> KEY AUTO_INCREMENT,
`name` <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">24</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> <span style="color:#0000ff">DEFAULT</span><span style="color:#a31515">''</span> COMMENT<span style="color:#a31515">'姓名'</span>,
`age` <span style="color:#a31515">INT</span> <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> <span style="color:#0000ff">DEFAULT</span> <span style="color:#880000">0</span> COMMENT<span style="color:#a31515">'年龄'</span>,
`pos` <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">20</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> <span style="color:#0000ff">DEFAULT</span><span style="color:#a31515">''</span> COMMENT<span style="color:#a31515">'职位'</span>,
`add_time` <span style="color:#a31515">TIMESTAMP</span> <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">CURRENT_TIMESTAMP</span> COMMENT<span style="color:#a31515">'入职时间'</span>
)CHARSET utf8 COMMENT<span style="color:#a31515">'员工记录表'</span>;
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> staffs(`name`,`age`,`pos`,`add_time`) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'z3'</span>,<span style="color:#880000">22</span>,<span style="color:#a31515">'manager'</span>,NOW());
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> staffs(`name`,`age`,`pos`,`add_time`) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'July'</span>,<span style="color:#880000">23</span>,<span style="color:#a31515">'dev'</span>,NOW());
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> staffs(`name`,`age`,`pos`,`add_time`) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'2000'</span>,<span style="color:#880000">23</span>,<span style="color:#a31515">'dev'</span>,NOW());
<span style="color:#0000ff">ALTER</span> <span style="color:#0000ff">TABLE</span> staffs <span style="color:#0000ff">ADD</span> INDEX index_staffs_nameAgePos(`name`,`age`,`pos`);
</code></span></span>
3 つの条件:
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>
次の説明で インデックスを構築する順序は(name, age, pos) であることに注意してください。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>
上記 2 つのインデックスは無効です。クエリ フィールドの順序がインデックス作成の順序と一致しない場合は、最適左プレフィックス ルールを満たす必要があります。
② ベストレフトプレフィックスルール
- 複数の列にインデックスが付けられている場合は、一番左のプレフィックス ルールに従う必要があります。インデックスの先頭の左端の列から開始し、インデックス内の列をスキップしないクエリを指します。
先陣を切る兄貴は死ねない! 真ん中の兄は壊れない!
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>
ref には const が 1 つだけあります。つまり、上記ではインデックスの一部のみが使用され、最初のインデックスである名前のみが使用されます。
② インデックス列に対して追加の操作を行う
インデックス列に対して操作 (計算、関数、(自動または手動) 型変換) を行わないと、インデックスが失敗し、テーブル全体のスキャンに切り替わります。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> <span style="color:#0000ff">left</span>(NAME,<span style="color:#880000">4</span>)<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
</code></span></span>
③複合インデックスの列の範囲を制限する
ストレージ エンジンは、インデックス内の範囲条件の右側の列を使用できません (複合インデックス内のフィールドの範囲を制限すると、インデックスが失敗することは理解しています。つまり、>、<、間...)および... は、複合インデックスのフィールドでは注意して使用されます)。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">></span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>
age=25 から age>25 に変更すると、型が ref から range に変わります。
④選択*
カバーインデックス (インデックスのみにアクセスするクエリ (インデックス列とクエリ列が一致している)) を使用してみて、select * を減らしてください。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'manager'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name,age,pos <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>
オンデマンドで取得し、select の使用を減らしたほうがよい *
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name,age,pos <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name,age,pos <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">></span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span>;
</code></span></span>
⑤!=または<>
Mysql は等しくない (!= または <>) を使用するとインデックスを使用できず、テーブル全体のスキャンが発生します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">!=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656"><></span><span style="color:#a31515">'July'</span>;
</code></span></span>
⑥nullであるかnullではない
null である、null ではない、インデックスも使用できません
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">is</span> <span style="color:#0000ff">null</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">is</span> <span style="color:#0000ff">not</span> <span style="color:#0000ff">null</span>;
</code></span></span>
Staffs テーブルを作成し、name フィールドの属性を null 以外に設定しているため、Extra は Impossible WHERE として出力されます。
以下は、Extra が不可能な WHERE の場合をさらに示しています。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> <span style="color:#880000">1</span><span style="color:#ab5656">=</span><span style="color:#880000">1</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> <span style="color:#880000">1</span><span style="color:#ab5656">!=</span><span style="color:#880000">1</span>;
</code></span></span>
⑦ワイルドカード%で始まる類似文字列
like はワイルドカード % ('%abc...') で始まり、mysql インデックスの失敗はテーブル全体のスキャン操作になります。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">like</span> <span style="color:#a31515">'%July%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">like</span> <span style="color:#a31515">'%July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">like</span> <span style="color:#a31515">'July%'</span>;
</code></span></span>
質問: '%string%' のような場合にインデックスが使用されない問題を解決するにはどうすればよいですか?
- 主キーインデックスを使用できます
- カバー インデックスを使用することをお勧めします。クエリ フィールドはカバー インデックス フィールドである必要があります。
- カバーインデックスが指すフィールドが varchar(380) または 380 を超えるフィールドである場合、カバーインデックスは失敗します。
新しいSQL
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> `tbl_user`(
`id` <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
`name` <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">20</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
`age`<span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
`email` <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">20</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
<span style="color:#0000ff">PRIMARY</span> KEY(`id`)
)ENGINE<span style="color:#ab5656">=</span>INNODB AUTO_INCREMENT<span style="color:#ab5656">=</span><span style="color:#880000">1</span> <span style="color:#0000ff">DEFAULT</span> CHARSET<span style="color:#ab5656">=</span>utf8;
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'1aa1'</span>,<span style="color:#880000">21</span>,<span style="color:#a31515">'[email protected]'</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'2bb2'</span>,<span style="color:#880000">23</span>,<span style="color:#a31515">'[email protected]'</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'3cc3'</span>,<span style="color:#880000">24</span>,<span style="color:#a31515">'[email protected]'</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'4dd4'</span>,<span style="color:#880000">26</span>,<span style="color:#a31515">'[email protected]'</span>);
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_user;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+-----------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age <span style="color:#ab5656">|</span> email <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+-----------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span>aa1 <span style="color:#ab5656">|</span> <span style="color:#880000">21</span> <span style="color:#ab5656">|</span> a<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span>bb2 <span style="color:#ab5656">|</span> <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> b<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span>cc3 <span style="color:#ab5656">|</span> <span style="color:#880000">24</span> <span style="color:#ab5656">|</span> c<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span>dd4 <span style="color:#ab5656">|</span> <span style="color:#880000">26</span> <span style="color:#ab5656">|</span> d<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+-----------+</span>
<span style="color:#880000">4</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
インデックスを作成する前に、次の説明を参照してください。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> id <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age,email <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age,email <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
インデックスは作成されず、テーブル全体が検索されます。
次にインデックスを作成します
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">CREATE</span> INDEX idx_user_nameAge <span style="color:#0000ff">ON</span> tbl_user(NAME,age);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.02</span> sec)
Records: <span style="color:#880000">0</span> Duplicates: <span style="color:#880000">0</span> Warnings: <span style="color:#880000">0</span>
</code></span></span>
次に、上記の一連の Explain を実行します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
インデックス(カバリングインデックス)を使用すると、
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
インデックス(カバリングインデックス)が使用されていることが分かります
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
インデックス(カバリングインデックス)が使用されていることが分かります
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age,email <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>
インデックスはもう使用されておらず、電子メール フィールドがある場合はテーブル全体でのみ検索できることがわかります。
2) カバリングインデックス(Covering Index)
それをインデックスカバレッジといいます。鍋や鍋の蓋と同様に、クエリ フィールドは作成されたインデックス以下である必要があります (注: 主キー ID は独自のインデックスで生成されるため、主キー フィールドはカバー インデックスには影響しません)。
方法 1 を理解する: 選択されたデータ列は、データ行を読み取ることなく、インデックスからのみ取得できます。MySQL は、インデックスに従ってデータ ファイルを再度読み取ることなく、インデックスを使用して選択リスト内のフィールドを返すことができます。言い換えれば、構築されたインデックスによって上書きされる列をクエリします。
方法 2 を理解する: インデックス付けは行を効率的に検索する方法ですが、一般的なデータベースではインデックスを使用して列内のデータを検索することもできるため、行全体を読み取る必要はありません。結局のところ、インデックス リーフ ノードにはインデックス付けされたデータが格納され、インデックスを読み取ることで目的のデータが取得できる場合は、行を読み取る必要はありません。クエリ結果を満たすデータを含む (またはカバーする) インデックスは、カバー インデックスと呼ばれます。
知らせ:
カバリング インデックスを使用する場合は、選択リストから必要な列のみを抽出することに注意する必要があります。また、* を選択することはできません。すべてのフィールドが一緒にインデックス付けされると、インデックス ファイルが大きくなりすぎ、クエリのパフォーマンスが低下するためです。減少。
まとめ
「%string%」のような場合にインデックスが使用されない問題を解決するにはどうすればよいですか? 複合インデックス、次にカバリングインデックス。
⑧ シングルクォーテーションを含まない数値文字列
数値文字列は一重引用符でインデックス付けされません。varchar 型は一重引用符で追加する必要があります。!!
MySQL の最下層は暗黙的な型変換を送信するため、効率に影響します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#880000">2000</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age <span style="color:#ab5656">|</span> pos <span style="color:#ab5656">|</span> add_time <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2000</span> <span style="color:#ab5656">|</span> <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> dev <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span>, <span style="color:#880000">1</span> warning (<span style="color:#880000">0.00</span> sec)
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'2000'</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age <span style="color:#ab5656">|</span> pos <span style="color:#ab5656">|</span> add_time <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2000</span> <span style="color:#ab5656">|</span> <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> dev <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#880000">2000</span>;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'2000'</span>;
</code></span></span>
⑨キーワードORを使用
または を控えめに使用すると、接続に使用するとインデックスが失敗します。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">or</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">'z3'</span>;
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">or</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">'z3'</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+---------+---------------------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age <span style="color:#ab5656">|</span> pos <span style="color:#ab5656">|</span> add_time <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+---------+---------------------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3 <span style="color:#ab5656">|</span> <span style="color:#880000">22</span> <span style="color:#ab5656">|</span> manager <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> July <span style="color:#ab5656">|</span> <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> dev <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+---------+---------------------+</span>
<span style="color:#880000">2</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
⑩注文までの後の簡単な概要
小さな要約
作成されたインデックスがあるとします:index(a,b,c)
where ステートメント | インデックスが使用されているかどうか |
---|---|
ここで、a = 3 | Y、まで使用 |
ここで、a = 3 および b = 5 | Y、a、bに慣れています |
ここで、a = 3、b = 5、c = 4 | Y、a、b、c に慣れています |
b = 3 または b = 3 かつ c = 4 または c = 4 | N (兄貴じゃないよ) |
ここで、a = 3 および c = 5 | A は使用されていますが、c は許可されておらず、b は中断されています |
ここで、a = 3、b > 4、および c = 5 | a と b を使用すると、範囲の後に c を使用できなくなり、b が壊れます |
ここで、a は null であり、b は null ではありません | is null はインデックスをサポートしますが、is not null はインデックスをサポートしません。そのため、a はインデックスを使用できますが、b は使用できません |
ここで <> 3 | インデックスは使用できません |
ここで、abs(a) = 3 | インデックスは使用できません |
ここで、a = 3、b は 'kk%' のように、c = 4 | Y、a、b、c に慣れています |
ここで、a = 3、b は '%kk' のように、c = 4 | Y、のみを使用してください |
ここで、a = 3、b は '%kk%' のように、c = 4 | Y、のみを使用してください |
ここで、a = 3、b は「k%kk%」のように、c = 4 | Y、a、b、c に慣れています |
最適化の概要式
完全な値は私のお気に入りと一致し、左端のプレフィックスに従う必要があります。
先頭の兄弟は死ぬことはできませんし、真ん中の兄弟は壊れることはありません。
インデックス列の計算が少なくなり、範囲以降はすべて無効になります。
LIKE は右端のパーセンテージを書き込み、カバーするインデックスに * を書き込みません。
等しくない null 値間の OR もあり、インデックスの影響に注意する必要があります。
VAR の引用符は失われることがなく、SQL の最適化にはコツがあります。
8- インデックス面接の質問分析
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-java">create table <span style="color:#a31515">test03</span>(
id <span style="color:#a31515">int</span> primary key not <span style="color:#a31515">null</span> auto_increment,
c1 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
c2 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
c3 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
c4 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
c5 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>)
);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'a1'</span>,<span style="color:#a31515">'a2'</span>,<span style="color:#a31515">'a3'</span>,<span style="color:#a31515">'a4'</span>,<span style="color:#a31515">'a5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'b1'</span>,<span style="color:#a31515">'b2'</span>,<span style="color:#a31515">'b3'</span>,<span style="color:#a31515">'b4'</span>,<span style="color:#a31515">'b5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'c1'</span>,<span style="color:#a31515">'c2'</span>,<span style="color:#a31515">'c3'</span>,<span style="color:#a31515">'c4'</span>,<span style="color:#a31515">'c5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'d1'</span>,<span style="color:#a31515">'d2'</span>,<span style="color:#a31515">'d3'</span>,<span style="color:#a31515">'d4'</span>,<span style="color:#a31515">'d5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'e1'</span>,<span style="color:#a31515">'e2'</span>,<span style="color:#a31515">'e3'</span>,<span style="color:#a31515">'e4'</span>,<span style="color:#a31515">'e5'</span>);
create index idx_test03_c1234 on <span style="color:#a31515">test03</span>(c1,c2,c3,c4);
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+------+------+------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> c1 <span style="color:#ab5656">|</span> c2 <span style="color:#ab5656">|</span> c3 <span style="color:#ab5656">|</span> c4 <span style="color:#ab5656">|</span> c5 <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+------+------+------+</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> a1 <span style="color:#ab5656">|</span> a2 <span style="color:#ab5656">|</span> a3 <span style="color:#ab5656">|</span> a4 <span style="color:#ab5656">|</span> a5 <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> b1 <span style="color:#ab5656">|</span> b2 <span style="color:#ab5656">|</span> b3 <span style="color:#ab5656">|</span> b4 <span style="color:#ab5656">|</span> b5 <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> c1 <span style="color:#ab5656">|</span> c2 <span style="color:#ab5656">|</span> c3 <span style="color:#ab5656">|</span> c4 <span style="color:#ab5656">|</span> c5 <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> d1 <span style="color:#ab5656">|</span> d2 <span style="color:#ab5656">|</span> d3 <span style="color:#ab5656">|</span> d4 <span style="color:#ab5656">|</span> d5 <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> e1 <span style="color:#ab5656">|</span> e2 <span style="color:#ab5656">|</span> e3 <span style="color:#ab5656">|</span> e4 <span style="color:#ab5656">|</span> e5 <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+------+------+------+</span>
<span style="color:#880000">5</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">show</span> index <span style="color:#0000ff">from</span> test03;
</code></span></span>
質問: 複合インデックス idx_test03_c1234 (c1、c2、c3、c4) を作成しました。次の SQL に従ってインデックスの使用状況を分析しますか?
①ケース1
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span>;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span>;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;
#换一下条件顺序
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span>;
</code></span></span>
1、2、3、4 を構築するのに、4、3、2、1 をクエリするのはなぜですか。インデックスは引き続き使用できますか? MySQL の第 2 層のオプティマイザーは、MySQL のコマンドを自動的に調整および最適化します。。
②ケース2
限られた範囲
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">></span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">></span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">></span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">></span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>
③事例3
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3;
</code></span></span>
c3 は検索ではなく並べ替えを行います。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3;
</code></span></span>
上の2つの説明は同じです。上記の 2 つの説明: c4='a4' とは関係ありません。3 階 (c3) で並べ替えるだけであり、探さないでください。
c3 による注文は c4 による注文に置き換えられます
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c4;
</code></span></span>
ファイルソートを使用して使用します。真ん中の兄弟は壊れていますが、MySQL は結果を渡さなければならないので、一度 filesort を使用してソートする必要があります
④ order byのフィールド順序とインデックスフィールドの順序
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c2,c3;
</code></span></span>
c1 のフィールド インデックスは 1 つだけ使用されますが、c2 と c3 は並べ替えに使用され、ファイル並べ替えは行われません。
order by c2,c3 を order by c3,c2 に置き換えます。
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3,c2;
</code></span></span>
Filesort が表示されました。構築したインデックスは 1234 で、順番が間違っています。3、2 が逆になっています。
⑤特殊な場合の順番
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c2,c3;mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c2,c3;
</code></span></span>
2 つのフィールド c1 と c2 をインデックスに使用しますが、c2 と c3 は並べ替えに使用されます。ファイルソートがなくて も c5='a5' であっても問題ありません。
上記の2番目のSQLのorder byはインデックス作成の順序に違反していますが、なぜfilesortを使用しないのですか?
なぜなら:
一般に、フィールドの順序による順序がインデックスの作成順序と矛盾している限り、filesort の使用が生成されます。
特殊なケースは、並べ替えられたフィールドがすでに定数であり、上記のケースは 2 つのフィールド c3 と c2='a2' の並べ替えです。
比較の手順:
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3,c2;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3,c2;
</code></span></span>
c2 をスキップして c3 を使用すると、「ファイルソートの使用」が表示されます。
⑥グループ化
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">group</span> <span style="color:#0000ff">by</span> c2,c3;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">group</span> <span style="color:#0000ff">by</span> c3,c2;
</code></span></span>
表面的には、group by はグループ化ですが、グループ化する前にソートする必要があるため、group by の最適化原理は order by とほぼ同じです。
固定値、範囲または並べ替え。一般的に order by は範囲を与えることです
Group by は基本的にソートする必要があり、一時テーブルが作成されます (構築されたインデックスは修正できません。MySQL 自体が内部で再度ソートします)。
一般的なアドバイス
- 単一キー インデックスの場合は、現在のクエリに対するフィルター機能がより優れたインデックスを選択するようにしてください。
- 結合インデックスを選択する場合、現在のクエリで最もフィルタリングしやすいフィールドはインデックス フィールドの順序であり、左にある。
- 複合インデックスを選択するときは、現在のクエリの where 句により多くのフィールドを含めることができるインデックスを選択するようにしてください。
- 統計情報を分析したり、クエリの記述方法を調整したりして、適切なインデックスを選択するようにしてください。
9- インデックス最適化 Q&A の補足と要約公式
インデックス(a, b, c) と仮定します。
- Y、a、b、c に慣れています
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">#百分号在右边,相当于说左边有常量了,实际上用到了c2索引mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2 <span style="color:#0000ff">like</span> <span style="color:#a31515">'kk%'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>
- Y、まで使用
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">#根据百分号在左边 c2直接用不了,导致中间兄弟断了,所以c3也用不了mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2 <span style="color:#0000ff">like</span> <span style="color:#a31515">'%kk'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>
- Y、まで使用
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">#理由同上mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2 <span style="color:#0000ff">like</span> <span style="color:#a31515">'%kk%'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>
- Y、a、b、c に慣れています
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2 <span style="color:#0000ff">like</span> <span style="color:#a31515">'k%kk%'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>