General talk about MySQL (2)

 2. Index optimization analysis

1- Reasons for SQL performance degradation

1. The query statement is badly written and no index is built

2. Index invalidation

  • single value
<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>
  • complex
<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. Too many joins in associated queries (design flaws or unavoidable requirements)

4. Server tuning and various parameter settings (buffering, number of threads, etc.)

2-SQL execution load order

<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>

Machine reading  begins with from

<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>

Summarize

3- Seven JOIN theories

  • For case 1

select * from A inner join B on A.key=B.key  inner indicates the need to query  the public part of AB

  • For case 2

select * from A left join B on A.key=B.key  left left indicates that  the public part of all AB in the left table is required + unique to A

  • For case 3

select * from A right join B on A.key=B.key  right right means that  the public part of all AB on the right table + B’s unique

  • For case 4 A should be monopolized

select * from A left join B on A.key=B.key where B.key is NULL  left Left indicates that all  parts of A + non-AB public parts of the left table are required

  • Exclusive for case 5 B

select * from A right join B on A.key=B.key where B.key is NULL  right Right means that all  B-owned parts of the right table are required + non-AB public parts

SQL writing of seven kinds of JOIN

To prepare, create the following tables and insert new data:

<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>

The result after execution:

<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.inner join

<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.left join

<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.right join

<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.left join 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.right join 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.full join

MySQL does not support full join, but it can be expressed in another way

<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.full join 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- What is an index

MySQL's official definition of index is: Index (Index) is a data structure that helps MySQL obtain data efficiently. The essence of the index can be obtained: the index is a data structure.

The purpose of the index is to improve query efficiency, which can be compared to a dictionary.

If we want to look up the word "mysql", we definitely need to locate the letter m, then find the letter y from the bottom down, and then find the rest of sql. If there is no index, then you may need to search one by one. What if I want to find the words that start with Java? Or what about words starting with Oracle?

You can simply understand it as "sorted fast lookup data structure".

  • sorted
  • quick search

In addition to data, database systems also maintain data structures that satisfy specific search algorithms . These data structures reference (point to) data in a certain way, so that advanced search algorithms can be implemented on these data structures. This data structure is an index . The following figure is an example of a possible indexing method:

On the left is the data table, which has two columns and seven records, and the leftmost one is the physical address of the data record.

In order to speed up the search of Col2, a binary search tree shown on the right can be maintained , each node contains an index key value and a pointer to the physical address of the corresponding data record, so that the binary search can be used within a certain complexity Get the corresponding data , so as to quickly retrieve the records that meet the conditions.

In summary, why are index lookups faster? Think about using a binary search tree to query is definitely faster than sequential traversal! Generally speaking, the index itself is also very large, and it is impossible to store all of it in memory, so the index is often stored on the disk in the form of an index file.

The index we usually refer to, if not specified, refers to the index organized by the B-tree (multi-way search tree, not necessarily binary) . Among them, the clustered index, secondary index, covering index, composite index, prefix index, and unique index all use B+ tree index by default, collectively referred to as index. Of course, in addition to the index of the B+ tree type, there are hash indexes and the like.

One note:

Generally, in an enterprise, if a piece of data is deleted, the active of this record is only changed to false . Many of the deletes that call the service layer are actually updates , which can only be said to be logically deleted, but the underlying database Records are still kept. One of the reasons: one is for data analysis; the other is the index (the index may be inaccurate if the data is deleted, and its position is no longer fixed). When the data is frequently increased and modified, the binary search tree will be inaccurate. ( Just rebuild the index again ).

① Index advantages and disadvantages

  • Advantage

Similar to the bibliographic index built by a university library, it improves the efficiency of data retrieval and reduces the IO cost of the database.

Sorting data through index columns reduces the cost of data sorting and reduces CPU consumption.

  • disadvantage

In fact, the index is also a table, which stores the primary key and index field, and points to the record of the entity table , so the index column also takes up space (occupies space)

Although the index greatly improves the query speed, it will reduce the speed of updating the table, such as INSERT, UPDATE and DELETE on the table. Because when updating the table, MySQL not only needs to save the data, but also saves the index file. Every time the field with the added index column is updated, the index information after the key value change caused by the update will be adjusted.

Indexing is only one factor to improve efficiency. If your MySQL has tables with a large amount of data, you need to spend time researching and building the best indexes or optimizing queries.

  • Summarize

Indexes, trade space for time.

② Index classification and index building command statement

MySQL index classification:

  • Single-value index: That is, an index contains only a single column, and a table can have multiple single-column indexes. ( It is recommended that there are no more than 5 indexes on a table and composite indexes are preferred )
  • Unique index: The value of the index column must be unique, but null values ​​are allowed.
  • Composite index: That is, an index contains multiple columns.
  • Basic syntax:
    • create
      • CREATE [UNIQUE] INDEX indexName ON mytable(columnName(length));
      • ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnName(length));
    • delete
      • DROP INDEX [indexName] ON mytable;
    • Check
      • SHOW INDEX FROM tableName
    • Use the alter command - there are four ways to add data table indexes
      • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);: This statement adds a primary key , which means that the index value must be unique and cannot be NULL.
      • ALTER TABLE tbl name ADD UNIQUE index_name (column_list);: The value of the index created by this statement must be unique (except for NULL, NULL may appear multiple times).
      • ALTER TABLE tbl_name ADD INDEX index_name (column_list);: Add a common index, the index value can appear multiple times.
      • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list): This statement specifies the index as FULLTEXT for full-text indexing.

③ Index structure and retrieval principle

MySQL index structure

  • BTree index
  • Hash index
  • full-text full-text index
  • R-Tree index

BTree index retrieval principle

Introduction to initialization

A b+ tree, the light blue block we call a disk block, you can see that each disk block contains several data items (shown in dark blue) and pointers (shown in yellow), such as disk block 1 contains data Items 17 and 35, containing pointers P1, P2, P3,

P1 represents disk blocks less than 17, P2 represents disk blocks between 17 and 35, and P3 represents disk blocks greater than 35.

The real data exists in the leaf nodes, namely 3, 5, 9, 10, 13, 15, 28, 29, 36, 60, 75, 79, 90, 99.

Non-leaf nodes do not store real data, but only store data items that guide the search direction , such as 17 and 35 do not actually exist in the data table. (as a reference comparison value)

search process

If data item 29 is to be searched, disk block 1 will be loaded from disk to memory first, and an IO will occur at this time. Use binary search in the memory to determine that 29 is between 17 and 35, and lock the P2 pointer of disk block 1. Because the memory time is very short (compared to disk IO), it can be ignored, and the disk address of the P2 pointer of disk block 1 is used. The disk block 3 is loaded from the disk to the memory, the second IO occurs, 29 is between 26 and 30, the P2 pointer of the disk block 3 is locked, and the disk block 8 is loaded into the memory through the pointer, the third IO occurs, and at the same time, the memory does The binary search finds 29, and ends the query, with a total of three IOs. the shorter the tree the better

The real situation is that a 3-layer b+ tree can represent millions of data. If millions of data lookups only need three IOs, the performance improvement will be huge. If there is no index, each data item requires one IO , then a total of millions of IOs are required, obviously the cost is very, very high.

④Which situations are suitable for indexing

  1. The primary key automatically creates a unique index
  2. Fields that are frequently used as query criteria should create indexes
  3. Fields associated with other tables in the query, foreign key relationships are indexed
  4. Frequently updated fields are not suitable for creating indexes, because each update not only updates the record but also updates the index
  5. No index is created for fields that are not used in the Where condition
  6. The choice of single key/composite index, who? (Ten to create a composite index under high concurrency)
  7. The sorted fields in the query, if the sorted fields are accessed through the index, the sorting speed will be greatly improved (index is retrieval + sorting)
  8. Statistical or grouping fields in queries

⑤Which situations are not suitable for indexing

  1. table records too few
  2. Tables that are frequently added, deleted, and modified (not built, although the query speed is improved, but the update efficiency is reduced, not only the fields must be updated, but the corresponding index information must also be updated)
  3. Table fields with repeated and evenly distributed data, so only the most frequently queried and most frequently sorted data columns should be indexed. Note that if a column contains many duplicates, indexing it will not have much practical effect.

If a table has 100,000 rows of records, a field A has only two values ​​of T and F, and the distribution probability of each value is about 50%, then indexing the field A of this table will generally not improve the query of the database speed .

The selectivity of an index is the ratio of the number of distinct values ​​in the indexed column to the number of records in the table. If there are 2000 records in a table, and the table index column has 1980 different values, then the selectivity of this index is 1980/2000=0.99. The closer the selectivity of an index is to 1, the more efficient the index is.

5-Prerequisite knowledge of performance analysis

MySQL Query Optimizer

There is an optimizer module in Mysql that is responsible for optimizing the SELECT statement. Its main function is to provide the Query requested by the client with the optimal execution plan (he considers the optimal data retrieval method) by calculating and analyzing the statistical information collected in the system. , but not necessarily the DBA thinks it is optimal, this part is the most time-consuming)

When the client requests a Query from MySQL, the command parser module completes the request classification, distinguishes it as SELECT and forwards it to MySQL Query Optimizer, MySQL Query Optimizer will first optimize the entire Query, and deal with the budget of some constant expressions directly converted to a constant value. And simplify and transform the query conditions in Query, such as removing some useless or obvious conditions, structural adjustment, etc. Then analyze the Hint information (if any) in the Query to see if the displayed Hint information can completely determine the execution plan of the Query. If there is no hint or the hint information is not enough to fully determine the execution plan, it will read the statistical information of the objects involved, write the corresponding calculation and analysis according to the query, and then draw the final execution plan.

Common MySQL bottlenecks

  • CPU: CPU saturation generally occurs when data is loaded into memory or read from disk
  • IO: The disk I/O bottleneck occurs when the loaded data is much larger than the memory capacity
  • The performance bottleneck of server hardware: top, free, iostat and vmstat to view the performance status of the system

①Introduction to use of explain

What is Explain: Use the EXPLAIN keyword to simulate the optimizer to execute SQL query statements, so as to know how MySQL processes your SQL statements. Analyze the performance bottleneck of your query statement or table structure.

Official website address

what can you do

  • table read order
  • The operation type of the data read operation
  • Which indexes can be used
  • which indexes are actually used
  • References between tables
  • How many rows per table are queried by the optimizer

How to play

  • explain + SQL statement
  • Information contained in the execution plan
    • | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
<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>

②Introduction to the id of explain

The serial number of the select query, including a set of numbers, indicating the order in which the select clause or operation table is executed in the query

three conditions:

  • The id is the same, the order of execution is from top to bottom

  • The id is different. If it is a subquery, the serial number of the id will increase. The larger the id value, the higher the priority, and the earlier it will be executed

  • The id is the same and different, and they exist at the same time

The id is the same, the order of execution is from top to bottom

The id is different. If it is a subquery, the serial number of the id will increase. The larger the id value, the higher the priority, and the earlier it will be executed

The id is the same and different, and they exist at the same time

summary

  • If the ids are the same, they can be considered as a group and executed sequentially from top to bottom;
  • In all groups, the larger the id value, the higher the priority, and the earlier it is executed. Derivation = DERIVED ( that is, the virtual table ). The 2 in driven2 indicates that it is a virtual table extended from the table with id 2
  • Always the bigger the id, the earlier the query

③Introduction to select_type and table of explain

select_type: The type of query , which is mainly used to distinguish complex queries such as ordinary queries, joint queries, and subqueries.

What are the select_types?

  1. SIMPLE - A simple select query that does not contain subqueries or UNIONs.
  2. PRIMARY - The outermost query is marked if the query contains any complex subparts . (equivalent to egg shells, the last to be loaded)
  3. SUBQUERY - A subquery is included in the SELECT or WHERE list. (egg yolk, loaded first)
  4. DERIUED - The subqueries contained in the FROM list are marked as DERIVED (derived) MySQL will recursively execute these subqueries and put the results in a temporary table.
  5. UNION - If the second SELECT appears after UNION, it is marked as UNION; if UNION is included in the subquery of the FROM clause, the outer SELECT will be marked as: DERIVED.
  6. UNION RESULT - SELECT to get results from UNION tables.

table: Displays which table the data of this row is about.

④Introduction to the type of explain

Access Type Arrangement

type shows the access type , which is a relatively important indicator. The result values ​​are in order from best to worst:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index >ALL

From best to worst: system>const>eq_ref>ref>range>index>ALL

Generally speaking, it is necessary to ensure that the query reaches at least the range level, and it is best to reach the ref.

Detailed description

  • system

The table has only one row of records (equal to the system table), which is a special column of the const type, which usually does not appear, and this can also be ignored. ( one record per table )

  • const

Indicates that the index is found once, and const is used to compare primary key or unique index. Because only one row of data is matched, MySQL can quickly convert the query into a constant if the primary key is placed in the where list. The following system is because only one record will be returned as a temporary table in the matching query.

  • eq_ref

Unique index scan, for each index key, only one record in the table matches it. Common for primary key or unique index scans.

  • ref

Non-unique index scan, which returns all rows matching a single value, is essentially an index access, which returns all rows matching a single value, however, it may find multiple eligible rows , so he Should be a mix of find and scan.

  • range

Retrieves only the given range of rows, using an index to select rows. The key column shows which index is used. Generally, there are queries such as between, <, >, in, etc. in your where statement. This range scan index scan is better than a full table scan because it only needs to start at one point in the index and end at another point without scanning the entire index .

  • index

Full Index Scan, the difference between index and ALL is that the index type only traverses the index tree . This is usually faster than ALL, because the index file is usually smaller than the data file (that is, although both all and Index read the full table, index is read from the index, and all is read from the hard disk).

  • ALL

Full Table Scan, will traverse the full table to find matching rows.

Remarks: Generally speaking, it is necessary to ensure that the query reaches at least the range level, and it is best to reach the ref level.

⑤ explain possible_keys and key introduction

possible_keys

Displays the indexes, one or more, that may be applied to this table. If there is an index on the fields involved in the query, the index will be listed, but not necessarily actually used by the query .

key

Whether the index is used; in the case of multiple indexes, which index is used by MySQL.

The actual index to use. If NULL, no index is used

If a covering index is used in the query, the select fields of the index and query overlap

⑥ Introduction to key_len of explain

Indicates the number of bytes used in the index, which can be used to calculate the length of the index used in the query. The shorter the length , the better without loss of accuracy

The value displayed by key_len is the maximum possible length of the index field, not the actual length used , that is, key_len is calculated according to the table definition, not retrieved from the table

⑦ref introduction of explain

A constant indicating which column of the index is used , if possible. Which columns or constants are used to look up values ​​on indexed columns.

It can be seen from key_len that the idx_col1_col2 index of the t1 table is fully used , col1 matches the col1 of the t2 table, and col2 matches a constant, namely 'ac'.

Col1 of the t2 table of the shared library;

Fields associated with other tables in the query, and foreign key relationships are indexed.

⑧rows introduction of explain

Based on table statistics and index selection, roughly estimate the number of rows that need to be read to find the required records . (how many rows of each table have been queried by the optimizer)

⑨Explain's Extra introduction

Contains important extra information that doesn't fit in other columns.

①Using filesort  narrowly escaped death

It means that mysql will use an external index to sort the data, instead of reading according to the index order in the table. The sorting operation that cannot be done using indexes in MySQL is called "file sorting"  \G means to use the key-value display method for output

I only partially use the index you created. I only partially use the index when querying, but I don't use it for sorting.

Compare the following two, where only col1 and col3 are used in the above, and col2 in the middle is gone; the latter uses col1, col2, and col3;

Comparing building an index to a repaired staircase, col1, col2, and col3 have built three roads;

The upper part is equivalent to performing another sorting step by myself, with one more internal toss; while the lower part is done step by step, obviously the lower part is more efficient than the upper part.

 ②Using temporary

Using temporary tables to save intermediate results, MysQL uses temporary tables when sorting query results . It is common in sorting order by and grouping query group by.

Order by and group by query are often the culprits that slow down SQL.

The upper part: the compound index (col1, col2) is established, but only col2 is used, and there is no first floor but directly to the second floor , so a temporary table and file sorting are required for processing;

The following part: col1 and col2 are established, and col1 and col2 are also used;

order by and group by group query should preferably be in the same order as the established index;

③Using index

Indicates that the corresponding select operation uses a covering index (Covering Index) to avoid accessing the data rows of the table, and the efficiency is good!

If using where appears at the same time, it indicates that the index is used to perform the search of the index key value;

If there is no using where at the same time, it indicates that the index is used to read data instead of performing search actions.

If using where appears at the same time, it indicates that the index is used to perform the search of the index key value;

Covering Index (Covering Index), one said index coverage.

1. The built index is a compound index (1, 2, 3);

2. Did not write select *; just checked is select 1 2 3 or select 1 2; this is the covering index;

Understanding method 1: the selected data column can be obtained only from the index, without reading the data row, MySQL can use the index to return the fields in the select list, without having to read the data file again according to the index, in other words, query the column To be overwritten by the built index .

Understanding method 2: Indexing is a way to efficiently find rows, but general databases can also use indexes to find data in a column, so it does not have to read the entire row. After all, the index leaf nodes store the data they index; when the desired data can be obtained by reading the index, there is no need to read the row. An index that contains (or covers) data that satisfies query results is called a covering index.

Notice:

If you want to use a covering index, be sure to take out only the required columns in the select list, and you cannot select *, because

If all fields are indexed together, the index file will be too large and the query performance will decrease.

What is a Covering Index?

covering index is an index that contains all of, and possibly more, the columns you need for your query.

For instance, this:

SELECT *
FROM tablename
WHERE criteria

will typically use indexes to speed up the resolution of which rows to retrieve using criteria, but then it will go to the full table to retrieve the rows.

However, if the index contained the columns column1, column2 and column3, then this sql:

SELECT column1, column2
FROM tablename
WHERE criteria

and, provided that particular index could be used to speed up the resolution of which rows to retrieve, the index already contains the values of the columns you’re interested in, so it won’t have to go to the table to retrieve the rows, but can produce the results directly from the index.

This can also be used if you see that a typical query uses 1-2 columns to resolve which rows, and then typically adds another 1-2 columns, it could be beneficial to append those extra columns (if they’re the same all over) to the index, so that the query processor can get everything from the index itself.

④Using where

Indicates where filtering is used.

⑤Using join buffer

Connection caching is used.

⑥impossible where

The value of the where clause is always false and cannot be used to obtain any tuples.

⑦select tables optimized away (not used much)

In the absence of the GROUP BY clause, the MIN/MAX operation is optimized based on the index, or the COUNT(*) operation is optimized for the MyISAM storage engine. It is not necessary to wait until the execution stage for calculation, and the optimization is completed in the stage of query execution plan generation.

⑧distinct (not used much)

Optimize the distinct operation, and stop looking for the same value after finding the first matching tuple.

⑩explain warm-up Case

The first row (execution sequence 4): the id column is 1, indicating that it is the first select in the union, the primary of the select_type column indicates that the query is an outer query, and the table column is marked as, indicating that the query result comes from a derived table. Among them, 3 in derived3 means that the query is derived from the third select query, that is, select with id 3. 【select d1.name... 】

The second row (execution sequence 2): id is 3, which is part of the third select in the entire query. Because the query is included in from, it is derived. 【select id,namefrom t1 where other_column=''】

The third line (execution sequence 3): The subquery select_type in the select list is subquery, which is the second select in the entire query. 【select id from t3】

The fourth line (execution sequence 1): select_type is union, indicating that the fourth select is the second select in the union, and execute [select name, id from t2] first

The fifth line (execution sequence 5): represents the stage of reading rows from the union temporary table, and <union1,4> in the table column indicates that the union operation is performed with the results of the first and fourth selects. [Two result union operation]

6- Index optimization case

① Index single table optimization case

Create table 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>
  • Query the article_id with the most views (only one) when category_id is 1 and comments are greater than 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> 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>

Conclusion: Obviously, type is ALL, which is the worst case. Using filesort also appeared in Extra, which is also the worst case. Optimization is a must.

start optimization

Create new index + delete index

<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>

Or create an index with the following 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>

Effect after creation

There is still Using filesort in Extra, and creating this index has little effect.

If comments > 1 is replaced by comments = 1, Using filesort can disappear, but it does not meet the requirements of the topic.

Since creating this index is of little use, delete it.

<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>

reason

type becomes range, which is tolerable. But the use of Using filesort in extra is still unacceptable.

But we have already built an index, why is it useless?

This is because according to the working principle of BTree index:

  • Sort category_id first
  • If the same category_id is encountered, then sort comments
  • If the same comments are encountered, the views are then sorted.

When the comments field is in the middle of the joint index, because the condition of comments > 1 is a range value (so-called range), the index after the range will become invalid , and MySQL cannot use the index to retrieve the subsequent views part, that is, the range type query Invalid index following field.

Improve

Compared with the index created last time, no index is created for the comments field this time.

<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>

explain again

<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>

It can be seen that the type has changed to ref, and the Using filesort in Extra has disappeared, and the result is very ideal.

Summarize:

Try not to index the query fields of the range type (generally, queries between, <, >, in, etc. appear in your where statement)!

②Case of indexing two tables optimization

New 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>

The result after creation:

<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>

Start explain analysis. The two tables have primary and foreign keys. Which table should the index be added to?

<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>

All types are all, need to be optimized, and the number of records to be queried is 21+20!

Create an index for 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>

explain analysis again

<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>

You can see that the type of the second line has changed to ref, and the number of rows has decreased, so the optimization is more obvious. This is determined by the left join feature. The characteristic of LEFT JOIN is that the left table has all; the conditions are used to determine how to search for rows from the right table, and the left must have them, so the right is our key point, and an index must be established in the right table.

delete create index for 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>

Create an index for 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>

explain analysis again

<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>

It can be seen that the right side is our key point. To optimize, we need to build an index on the right table.

Then we switch to right join RIGHT JOIN query

<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>

Changing to the left is our key point. To optimize, we need to build an index on the left table.

summary

Index two tables are optimized, left join the right table to build an index, right join the left table to build an index.

③Index three-table optimization case

New 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>

after effects

<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>

Reuse the book and class tables in the previous section, and remove their original indexes.

<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>

Create new indexes for phone.card and 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 Three-table connection Three tables are associated at least twice, which table should the index be built on?

<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>

The types of the last two lines are both ref and the total rows are well optimized, and the effect is good. Therefore, it is best to set the index in the field that needs to be queried frequently.

in conclusion

Optimization of the Join statement

Minimize the total number of loops of NestedLoop in the Join statement ( do not join too much or nest ): " Always use a small result set to drive a large result set ".

Prioritize the optimization of the inner loop of NestedLoop to ensure that the Join condition field on the driven table in the Join statement has been indexed.

When the Join condition field of the driven table cannot be guaranteed to be indexed and the memory resources are sufficient, do not be too stingy with the setting of the JoinBuffer (in the my.cnf file).

7- Index invalidation

Various reasons for index failure: (should be avoided)

  1. full value match favorites
  2. Best Left Prefix Rule - If multiple columns are indexed, follow the leftmost prefix rule. It means that the query starts from the leftmost front column of the index and does not skip the middle column of the composite index .
  3. Doing no operations (calculation, function, (automatic or manual) type conversion) on the index column will cause the index to fail and switch to full table scan.
  4. The storage engine cannot use columns to the right of the range condition in the index.
  5. Try to use the covering index (query that only accesses the index (the index column is consistent with the query column)) and reduce select *.
  6. Mysql cannot use the index when using not equal (!= or <>), which will cause a full table scan.
  7. is null, is not null also cannot use the index.
  8. Like starts with a wildcard ('%abc...'), and mysql index failure will become a full table scan operation.
  9. Indexes without single quotes are invalid for strings.
  10. Use or sparingly, and the index will fail when you use it to connect.

①Full value matches my favorite

New 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>

three conditions:

<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>

 Note that the order in which we build the index in the following explain is: (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>

The above two indexes are invalid. If the order of query fields is inconsistent with the order of index creation, the best left prefix rule needs to be satisfied.

② Best left prefix rule

  • If multiple columns are indexed, the leftmost prefix rule must be followed. Refers to the query starting from the leftmost front column of the index and not skipping columns in the index .

The big brother who takes the lead can't die!  The middle brother can't be broken!

<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 has only one const, which means that the above only uses part of the index, and only the first index, name.

② Do additional operations on the index column

Doing no operations (calculation, function, (automatic or manual) type conversion) on the index column will cause the index to fail and switch to full table scan.

<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>

③ Limit the range of a column in the composite index

The storage engine cannot use the columns on the right side of the range condition in the index (I understand that limiting the range of a field in the composite index will cause the index to fail, that is, >, <, between...and... are used with caution in a field in the composite index).

<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>

After changing from age=25 to age>25, the type changes from ref to range.

④select *

Try to use the covering index (query that only accesses the index (the index column and the query column are consistent)), reduce 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>

We'd better get it on demand and use less 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>

⑤!= or <>

Mysql cannot use the index when using not equal (!= or <>), which will cause a full table scan.

<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>

⑥is null or is not null

is null, is not null also cannot use the index

<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>

Extra is printed as Impossible WHERE because we are creating the staffs table and setting the attribute of the name field to not null.

The following additionally demonstrates the case where Extra is Impossible 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 strings starting with wildcard %

like starts with a wildcard % ('%abc...'), and mysql index failure will become a full table scan operation.

<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>

Question: How to solve the problem that the index is not used when like '%string%'?

  • You can use the primary key index
  • It is recommended to use a covering index, and the query field must be a covering index field
  • When the field pointed to by the covering index is a field of varchar(380) or more than 380, the covering index will fail!

New 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>

Before creating an index, take a look at the following explain:

<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>

There is no index created, and the whole table is searched.

Now create the index

<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>

Then execute the above series of 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>

It can be seen that using the index (covering index)

<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>

It can be seen that the index (covering index) is used

<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>

It can be seen that the index (covering index) is used

<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>

It can be seen that the index is not used anymore, and if there is an email field, it can only be searched in the whole table.

2) Covering Index (Covering Index)

It is called index coverage. Analogous to pots and pot lids, the query field must be smaller than or equal to the created index ( note: the primary key id is born with its own index, so the primary key field has no effect on the covering index ).

Understanding method 1: the selected data column can only be obtained from the index, without reading the data row, MySQL can use the index to return the fields in the select list, without having to read the data file again according to the index, in other words, query the column To be overwritten by the built index .

Understanding method 2: Indexing is a way to efficiently find rows, but general databases can also use indexes to find data in a column, so it does not have to read the entire row. After all, the index leaf nodes store the data they index; when the desired data can be obtained by reading the index, there is no need to read the row. An index that contains (or covers) data that satisfies query results is called a covering index.

Notice:

If you want to use a covering index, you must pay attention to only extracting the required columns from the select list, and you cannot select *, because if all fields are indexed together, the index file will be too large and the query performance will decrease.

summary

How to solve the problem that the index is not used when like '%string%'? Composite index, then covering index.

⑧ number string without single quotes

The number string is not indexed with single quotes . The varchar type must be added with single quotes! ! !

The bottom layer of MySQL sends implicit type conversion, which affects efficiency.

<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>

⑨Use keyword OR

Use or sparingly, and the index will fail when you use it to connect .

<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>

⑩Small summary after where before order by

small summary

Suppose the created index: index(a,b,c)

where statement whether the index is used
where a = 3 Y, used until a
where a = 3 and b = 5 Y, used to a, b
where a = 3 and b = 5 and c = 4 Y, used to a, b, c
where b = 3 or where b = 3 and c = 4 or where c = 4 N ( no big brother a )
where a = 3 and c = 5 A is used, but c is not allowed, and b is interrupted
where a = 3 and b > 4 and c = 5 When a and b are used, c cannot be used after the range, and b is broken
where a is null and b is not null is null supports index but is not null does not, so a can use index, but b cannot
where a <> 3 cannot use index
where abs(a) =3 cannot use index
where a = 3 and b like 'kk%' and c = 4 Y, used to a, b, c
where a = 3 and b like '%kk' and c = 4 Y, only use a
where a = 3 and b like '%kk%' and c = 4 Y, only use a
where a = 3 and b like 'k%kk%' and c = 4 Y, used to a, b, c

Optimization summary formula

The full value matches my favorite, and the leftmost prefix must be followed;

The leading brother cannot die, and the middle brother cannot be broken;

Less calculations on the index column, all invalid after the range;

LIKE writes the rightmost percentage, and does not write * in the covering index;

There is also OR between unequal null values, and the impact of indexes should be paid attention to;

VAR quotation marks can not be lost, SQL optimization has a knack.

8- Index interview question analysis

<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>

Question: We have created a compound index idx_test03_c1234 (c1, c2, c3, c4), and analyze the index usage according to the following SQL?

① Case 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>

Why do I build 1, 2, 3, 4, but I query 4, 3, 2, 1, can I still use the index? The Optimizer in the second layer of MySQL will automatically adjust and optimize the commands in MySQL. .

②Case 2

limited range

<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>

③Case 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 acts on sorting instead of searching

<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>

The above two explain are the same. The above two explanations: It has nothing to do with c4='a4',  just sort on the third floor (c3), don't look for it.

Order by c3 is replaced by order by 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>

Use Using filesort. The brother in the middle is broken, but MySQL has to hand over the results, so it has to sort Using filesort once

④ The field order of order by and the order of index fields

<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>

Only one field index of c1 is used, but c2 and c3 are used for sorting, no filesort.

Replace order by c2,c3 with 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 appeared, the index we built is 1234, it is not in order, 3, 2 are reversed.

⑤Special cases in 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> 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>

Use c1 and c2 to index, but c2 and c3 are used for sorting, no filesort  and c5='a5' have nothing to do

The order by of the above second SQL violates the order of creating indexes, so why is there no using filesort?

Because:

  • In general: as long as the order by field order is inconsistent with the order in which the index is created, using filesort will be generated;

  • The special case is: the sorted field is already a constant, and the above case is the sorting of the two fields c3 and c2='a2'.

Comparison instructions:

<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>

Skip c2, use c3, and Using filesort appears.

⑥group 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> 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>

On the surface, group by is grouping, but it must be sorted before grouping, so the optimization principle of group by is almost the same as order by

Fixed value, range or sorting, generally order by is to give a range

Group by basically needs to be sorted, and there will be a temporary table (the built index can't be fixed, MySQL itself sorts again internally)

general advice

  • For single-key indexes, try to choose an index with better filterability for the current query.
  • When selecting a combined index, the field with the best filterability in the current Query is in the order of the index fields, and the farther to the left better.
  • When choosing a composite index, try to choose an index that can contain more fields in the where clause in the current query.
  • Try to select the appropriate index by analyzing the statistical information and adjusting the writing method of the query.

9- Index optimization Q & A supplement and summary formula

Suppose index(a, b, c)

  • Y, used to 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, used until a
<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, used until a
<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, used to 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>

Guess you like

Origin blog.csdn.net/m0_60961651/article/details/132272812