MySQL泛泛而谈(二)

 二、索引优化分析

1-SQL性能下降原因

1.查询语句写的烂 没建索引

2.索引失效

  • 单值
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> <span style="color:#0000ff">user</span> <span style="color:#0000ff">where</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">''</span>;
<span style="color:#0000ff">create</span> index idx_user_name <span style="color:#0000ff">on</span> <span style="color:#0000ff">user</span>(name);
</code></span></span>
  • 复合
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> <span style="color:#0000ff">user</span> <span style="color:#0000ff">where</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">''</span> <span style="color:#0000ff">and</span> email<span style="color:#ab5656">=</span><span style="color:#a31515">''</span>;
<span style="color:#0000ff">create</span> index idx_user_name <span style="color:#0000ff">on</span> <span style="color:#0000ff">user</span>(name, email);
</code></span></span>

3.关联查询太多join(设计缺陷或不得已的需求)

4.服务器调优及各个参数设置(缓冲、线程数等)

2-SQL执行加载顺序

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">SELECT</span> <span style="color:#0000ff">DISTINCT</span>
    <span style="color:#ab5656"><</span>select_list<span style="color:#ab5656">></span>
<span style="color:#0000ff">FROM</span>
    <span style="color:#ab5656"><</span>left_table<span style="color:#ab5656">></span> <span style="color:#ab5656"><</span>join_type<span style="color:#ab5656">></span>
<span style="color:#0000ff">JOIN</span> 
    <span style="color:#ab5656"><</span>right_table<span style="color:#ab5656">></span> 
<span style="color:#0000ff">ON</span>
    <span style="color:#ab5656"><</span>join_condition<span style="color:#ab5656">></span>
<span style="color:#0000ff">WHERE</span>
    <span style="color:#ab5656"><</span>where_condition<span style="color:#ab5656">></span>
<span style="color:#0000ff">GROUP</span> <span style="color:#0000ff">BY</span>
    <span style="color:#ab5656"><</span>group_by_list<span style="color:#ab5656">></span>
<span style="color:#0000ff">HAVING</span>
    <span style="color:#ab5656"><</span>having_condition<span style="color:#ab5656">></span>
<span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span>
    <span style="color:#ab5656"><</span>order_by_condition<span style="color:#ab5656">></span>
LIMIT
    <span style="color:#ab5656"><</span>limit_number<span style="color:#ab5656">></span>
</code></span></span>

机读 先从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>

总结

3-七种JOIN理论

  • 针对情况1

select * from A inner join B on A.key=B.key inner表示需要内查询 AB的公共部分

  • 针对情况2

select * from A left join B on A.key=B.key left左表示需要左表的全部 AB的公共部分+A的独有

  • 针对情况3

select * from A right join B on A.key=B.key right右表示需要右表的全部 AB的公共部分+B的独有

  • 针对情况4 A要独占

select * from A left join B on A.key=B.key where B.key is NULL left 左表示需要左表的全部 A所有的部分+非AB的公共部分

  • 针对情况5 B要独占

select * from A right join B on A.key=B.key where B.key is NULL right 右表示需要右表的全部 B所有的部分+非AB的公共部分

七种JOIN的SQL编写

准备工作,创建以下表,插入新数据:

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> tbl_dept(
	id <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
	deptName <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">30</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
	locAdd <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">40</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
	<span style="color:#0000ff">PRIMARY</span> KEY(id)
)ENGINE<span style="color:#ab5656">=</span>INNODB AUTO_INCREMENT<span style="color:#ab5656">=</span><span style="color:#880000">1</span> <span style="color:#0000ff">DEFAULT</span> CHARSET<span style="color:#ab5656">=</span>utf8;

<span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> tbl_emp (
	id <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
	NAME <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">20</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
	deptId <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
	<span style="color:#0000ff">PRIMARY</span> KEY (id),
	KEY fk_dept_Id (deptId)
	#<span style="color:#0000ff">CONSTRAINT</span> <span style="color:#a31515">'fk_dept_Id'</span> <span style="color:#0000ff">foreign</span> key (<span style="color:#a31515">'deptId'</span>) <span style="color:#0000ff">references</span> <span style="color:#a31515">'tbl_dept'</span>(<span style="color:#a31515">'Id'</span>)
)ENGINE<span style="color:#ab5656">=</span>INNODB AUTO_INCREMENT<span style="color:#ab5656">=</span><span style="color:#880000">1</span> <span style="color:#0000ff">DEFAULT</span> CHARSET<span style="color:#ab5656">=</span>utf8;

<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'RD'</span>,<span style="color:#880000">11</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'HR'</span>,<span style="color:#880000">12</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'MK'</span>,<span style="color:#880000">13</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'MIS'</span>,<span style="color:#880000">14</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_dept(deptName,locAdd) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'FD'</span>,<span style="color:#880000">15</span>);

<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'z3'</span>,<span style="color:#880000">1</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'z4'</span>,<span style="color:#880000">1</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'z5'</span>,<span style="color:#880000">1</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'w5'</span>,<span style="color:#880000">2</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'w6'</span>,<span style="color:#880000">2</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'s7'</span>,<span style="color:#880000">3</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'s8'</span>,<span style="color:#880000">4</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_emp(NAME,deptId) <span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'s9'</span>,<span style="color:#880000">51</span>);
</code></span></span>

执行后的结果:

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_dept;
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+</span>
<span style="color:#880000">5</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)

mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_emp;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7   <span style="color:#ab5656">|</span>      <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8   <span style="color:#ab5656">|</span>      <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9   <span style="color:#ab5656">|</span>     <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+--------+</span>
<span style="color:#880000">8</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
#这就是为什么需要<span style="color:#0000ff">join</span> <span style="color:#0000ff">from</span>优先级最高,而笛卡尔积查询的太多了
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_dept,tbl_emp;
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+----+------+--------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> deptName <span style="color:#ab5656">|</span> locAdd <span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> NAME <span style="color:#ab5656">|</span> deptId <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+----+------+--------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> z4   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> z5   <span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> w5   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> w6   <span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7   <span style="color:#ab5656">|</span>      <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7   <span style="color:#ab5656">|</span>      <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7   <span style="color:#ab5656">|</span>      <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7   <span style="color:#ab5656">|</span>      <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">6</span> <span style="color:#ab5656">|</span> s7   <span style="color:#ab5656">|</span>      <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8   <span style="color:#ab5656">|</span>      <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8   <span style="color:#ab5656">|</span>      <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8   <span style="color:#ab5656">|</span>      <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8   <span style="color:#ab5656">|</span>      <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">7</span> <span style="color:#ab5656">|</span> s8   <span style="color:#ab5656">|</span>      <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> RD       <span style="color:#ab5656">|</span> <span style="color:#880000">11</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9   <span style="color:#ab5656">|</span>     <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> HR       <span style="color:#ab5656">|</span> <span style="color:#880000">12</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9   <span style="color:#ab5656">|</span>     <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> MK       <span style="color:#ab5656">|</span> <span style="color:#880000">13</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9   <span style="color:#ab5656">|</span>     <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> MIS      <span style="color:#ab5656">|</span> <span style="color:#880000">14</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9   <span style="color:#ab5656">|</span>     <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> FD       <span style="color:#ab5656">|</span> <span style="color:#880000">15</span>     <span style="color:#ab5656">|</span>  <span style="color:#880000">8</span> <span style="color:#ab5656">|</span> s9   <span style="color:#ab5656">|</span>     <span style="color:#880000">51</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+----------+--------+----+------+--------+</span>
<span style="color:#880000">40</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.04</span> sec)
</code></span></span>

1.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不支持full 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:#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-索引是什么

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。

索引的目的在于提高查询效率,可以类比字典。

如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要逐个逐个寻找,如果我想找到Java开头的单词呢?或者Oracle开头的单词呢?

你可以简单理解为“排好序的快速查找数据结构”。

  • 排好序
  • 快速查找

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。下图就是一种可能的索引方式示例:

左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址。

为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。

总结来说,为什么索引查找会快呢?想想使用二叉查找树去查询肯定比顺序遍历要快啊!一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。

我们平常所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。

一个注意点:

一般在企业中,delete了一条数据,仅仅只是把这一条记录的active修改了false,其中调用service层的delete实际上很多都是update,只能说是逻辑上进行了删除,但是其底层数据库的记录依旧保留着。其原因之一:一个是为了数据分析;另外一个就是索引(数据被删除了索引可能不准确了,其位置不再固定了)。当数据频繁的增加,修改后,这个二叉查找树就不准确了。(干脆把索引重建一遍)。

①索引优劣势

  • 优势

类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本。

通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

  • 劣势

实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的(占空间)

虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询。

  • 总结

索引,空间换取时间。

②索引分类和建索引命令语句

MySQL索引分类:

  • 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。(建议一张表的索引不要超过5个 优先考虑复合索引
  • 唯一索引:索引列的值必须唯一,但允许有空值。
  • 复合索引:即一个索引包含多个列。
  • 基本语法:
    • 创建
      • CREATE [UNIQUE] INDEX indexName ON mytable(columnName(length));
      • ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnName(length));
    • 删除
      • DROP INDEX [indexName] ON mytable;
    • 查看
      • SHOW INDEX FROM tableName
    • 使用alter命令 - 有四种方式来添加数据表的索引
      • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);:该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
      • ALTER TABLE tbl name ADD UNIQUE index_name (column_list);:这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
      • ALTER TABLE tbl_name ADD INDEX index_name (column_list);:添加普通索引,索引值可出现多次。
      • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为FULLTEXT,用于全文索引。

③索引结构与检索原理

MySQL索引结构

  • BTree索引
  • Hash索引
  • full-text全文索引
  • R-Tree索引

BTree索引检索原理

初始化介绍

一颗b+树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,

P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。

真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。

非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。(作为参考比较值)

查找过程

如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO。在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。树越矮越好

真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

④哪些情况适合建索引

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 查询中与其它表关联的字段,外键关系建立索引
  4. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
  5. Where条件里用不到的字段不创建索引
  6. 单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
  7. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度(索引就是检索+排序)
  8. 查询中统计或者分组字段

⑤哪些情况不适合建索引

  1. 表记录太少
  2. 经常增删改的表(不建,虽然提高了查询速度,但是降低了更新的效率,不但要更新字段,还得更新对应的索引信息)
  3. 数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某列包含许多重复的内容,为它建立索引就没有太大的实际效果。

假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率天约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度

索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99。一个索引的选择性越接近于1,这个索引的效率就越高。

5-性能分析前提知识

MySQL Query Optimizer

Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(他认为最优的数据检索方式,但不见得是DBA认为是最优的,这部分最耗费时间)

当客户端向MySQL请求一条Query,命令解析器模块完成请求分类,区别出是SELECT并转发给MySQL Query Optimizer时,MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等。然后分析Query 中的 Hint信息(如果有),看显示Hint信息是否可以完全确定该Query的执行计划。如果没有Hint 或Hint信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据Query进行写相应的计算分析,然后再得出最后的执行计划。

MySQL常见瓶颈

  • CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候
  • IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
  • 服务器硬件的性能瓶颈:top,free,iostat和vmstat来查看系统的性能状态

①explain使用简介

Explain是什么:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

官网地址

能干嘛

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

怎么玩

  • explain + SQL语句
  • 执行计划包含的信息
    • | 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>

②explain之id介绍

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

三种情况:

  • id相同,执行顺序由上至下

  • id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

  • id相同不同,同时存在

id相同,执行顺序由上至下

id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

id相同不同,同时存在

小结

  • id如果相同,可以认为是一组,从上往下顺序执行;
  • 在所有组中,id值越大,优先级越高,越先执行,衍生=DERIVED(就是那张虚表)drived2中的那个2表示是id为2的那个表延申出来的虚表
  • 永远是id越大越先查询

③explain之select_type和table介绍

select_type:查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

select_type有哪些?

  1. SIMPLE - 简单的select查询,查询中不包含子查询或者UNION。
  2. PRIMARY - 查询中若包含任何复杂的子部分,最外层查询则被标记为。(相当于鸡蛋壳,最后被加载的)
  3. SUBQUERY - 在SELECT或WHERE列表中包含了子查询。(鸡蛋黄,先被加载的)
  4. DERIUED - 在FROM列表中包含的子查询被标记为DERIVED(衍生)MySQL会递归执行这些子查询,把结果放在临时表里。
  5. UNION - 若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中外层SELECT将被标记为:DERIVED。
  6. UNION RESULT - 从UNION表获取结果的SELECT。

table:显示这一行的数据是关于哪张表的。

④explain之type介绍

访问类型排列

type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:

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

从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。

详细说明

  • system

表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。(单表一条记录

  • const

表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快如将主键置于where列表中,MySQL就能将该查询转换为一个常量。下面的system是因为符合查询中只会返回一条记录作为临时表。

  • eq_ref

唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。

  • ref

非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。

  • range

只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引一般就是在你的where语句中出现了between、<、>、in等的查询。这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引

  • index

Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)。

  • ALL

Full Table Scan,将遍历全表以找到匹配的行。

备注:一般来说,得保证查询至少达到range级别,最好能达到ref。

⑤explain之possible_keys和key介绍

possible_keys

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段火若存在索引,则该索引将被列出,但不一定被查询实际使用

key

是否使用到了索引;在多个索引存在的情况下,MySQL究竟使用到了哪一个索引。

实际使用的索引。如果为NULL,则没有使用索引

查询中若使用了覆盖索引,则索引和查询的select字段重叠

⑥explain之key_len介绍

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好

key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的

⑦explain之ref介绍

显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。

由key_len可知t1表的idx_col1_col2索引被充分使用,col1匹配t2表的col1,col2匹配了一个常量,即 ‘ac’。

shared库的t2表的col1;

查询中与其它表关联的字段,外键关系建立索引。

⑧explain之rows介绍

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。(每张表有多少行被优化器查询过)

⑨explain之Extra介绍

包含不适合在其他列中显示但十分重要的额外信息。

①Using filesort 九死一生

说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为"文件排序" \G表示使用key-value的显示方式进行输出

你建立的索引我只是部分使用到了,查询的时候我只是部分使用到了索引,排序我并没有用到。

对比下面两者,其中上面只用到了col1和col3,中间col2没了;下者使用到了col1、col2、col3;

把建索引比喻成修好的楼梯,col1、col2、col3修了三条路;

上面的部分相当于自己又进行了一次排序的步骤,内部的折腾多了一次;而下面的就是一步步来的,显然下面的效率要高于上面的部分。

②Using temporary 必死

使了用临时表保存中间结果,MysQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。

order by和分组查询group by经常是拖慢SQL的元凶。

上面的部分:建立的复合索引(col1,col2),但是只用到了col2,没有一楼而直接上二楼,所以需要临时表和文件排序进行处理;

下面的部分:建立的是col1、col2,使用的也是col1、col2;

order by和分组查询group by最好和建立的索引顺序一致;

③Using index

表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!

如果同时出现using where,表明索引被用来执行索引键值的查找;

如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。

如果同时出现using where,表明索引被用来执行索引键值的查找;

覆盖索引(Covering Index),一说为索引覆盖。

1、建是索引是复合索引(1,2,3);

2、没有写select * ;刚好查的就是 select 1 2 3或者select 1 2;这就是覆盖索引;

理解方式一:就是select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖

理解方式二:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引。

注意:

如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select*,因为

如果将所有字段一起做索引会导致索引文件过大,查询性能下降。

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

表明使用了where过滤。

⑤Using join buffer

使用了连接缓存。

⑥impossible where

where子句的值总是false,不能用来获取任何元组。

⑦select tables optimized away(用的不多)

在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

⑧distinct(用的不多)

优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。

⑩explain之热身Case

第一行(执行顺序4):id列为1,表示是union里的第一个select,select_type列的primary表示该查询为外层查询,table列被标记为,表示查询结果来自一个衍生表,其中derived3中3代表该查询衍生自第三个select查询,即id为3的select。【select d1.name… 】

第二行(执行顺序2):id为3,是整个查询中第三个select的一部分。因查询包含在from中,所以为derived。【select id,namefrom t1 where other_column=’’】

第三行(执行顺序3):select列表中的子查询select_type为subquery,为整个查询中的第二个select。【select id from t3】

第四行(执行顺序1):select_type为union,说明第四个select是union里的第二个select,最先执行【select name,id from t2】

第五行(执行顺序5):代表从union的临时表中读取行的阶段,table列的<union1,4>表示用第一个和第四个select的结果进行union操作。【两个结果union操作】

6-索引优化案例

①索引单表优化案例

建表SQL

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> article(
	id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> <span style="color:#0000ff">PRIMARY</span> KEY AUTO_INCREMENT,
	author_id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	category_id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	views <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	comments <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	title <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">255</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	content TEXT <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>
);

<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> article(author_id,category_id,views,comments,title,content)
<span style="color:#0000ff">VALUES</span>
(<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#a31515">'1'</span>,<span style="color:#a31515">'1'</span>),
(<span style="color:#880000">2</span>,<span style="color:#880000">2</span>,<span style="color:#880000">2</span>,<span style="color:#880000">2</span>,<span style="color:#a31515">'2'</span>,<span style="color:#a31515">'2'</span>),
(<span style="color:#880000">1</span>,<span style="color:#880000">1</span>,<span style="color:#880000">3</span>,<span style="color:#880000">3</span>,<span style="color:#a31515">'3'</span>,<span style="color:#a31515">'3'</span>);
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> article;
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+-------------+-------+----------+-------+---------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> author_id <span style="color:#ab5656">|</span> category_id <span style="color:#ab5656">|</span> views <span style="color:#ab5656">|</span> comments <span style="color:#ab5656">|</span> title <span style="color:#ab5656">|</span> content <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+-------------+-------+----------+-------+---------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>         <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>           <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>     <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>        <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span>     <span style="color:#ab5656">|</span> <span style="color:#880000">1</span>       <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>         <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>           <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>     <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>        <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span>     <span style="color:#ab5656">|</span> <span style="color:#880000">2</span>       <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>         <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>           <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>     <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>        <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span>     <span style="color:#ab5656">|</span> <span style="color:#880000">3</span>       <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+-------------+-------+----------+-------+---------+</span>
<span style="color:#880000">3</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>
  • 查询category_id为1且comments 大于1的情况下,views最多的article_id (只有一条)
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> id, author_id <span style="color:#0000ff">FROM</span> article <span style="color:#0000ff">WHERE</span> category_id <span style="color:#ab5656">=</span> <span style="color:#880000">1</span> <span style="color:#0000ff">AND</span> comments <span style="color:#ab5656">></span> <span style="color:#880000">1</span> <span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span> views <span style="color:#0000ff">DESC</span> LIMIT <span style="color:#880000">1</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> author_id <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>         <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+-----------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>

结论:很显然,type是ALL,即最坏的情况。Extra里还出现了Using filesort,也是最坏的情况。优化是必须的。

开始优化

新建索引+删除索引

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">create</span> index idx_article_ccv <span style="color:#0000ff">on</span> article(category_id,comments,views);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.03</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>	
</code></span></span>

或者用下面sql创建索引:

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">ALTER</span> <span style="color:#0000ff">TABLE</span> <span style="color:#a31515">'article'</span> <span style="color:#0000ff">ADD</span> INDEX idx_article_ccv ( <span style="color:#a31515">'category_id , '</span>comments<span style="color:#a31515">', '</span>views<span style="color:#a31515">' );
</span></code></span></span>

创建后的效果

Extra里还是出现了Using filesort,创建这索引作用不大。

如果comments > 1换成comments = 1,可以让Using filesort消失,但不符题目要求。

既然创建这索引作用不大,删了它吧。

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

缘由

type变成了range,这是可以忍受的。但是extra里使用Using filesort仍是无法接受的。

但是我们已经建立了索引,为啥没用呢?

这是因为按照BTree索引的工作原理:

  • 先排序category_id
  • 如果遇到相同的category_id则再排序comments
  • 如果遇到相同的comments 则再排序views。

当comments字段在联合索引里处于中间位置时,因comments > 1条件是一个范围值(所谓range),范围以后的索引会失效,MySQL无法利用索引再对后面的views部分进行检索,即range类型查询字段后面的索引无效。

改进

跟上次创建索引相比,这次不为comments字段创建索引。

<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

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

可以看到,type变为了ref,Extra中的Using filesort也消失了,结果非常理想。

总结:

尽量不要对range类型(一般就是在你的where语句中出现了between、<、>、in等的查询)的查询字段建索引!

②索引两表优化案例

新建SQL

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> class(
	id <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
	card <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	<span style="color:#0000ff">PRIMARY</span> KEY(id)
);

<span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> book(
	bookid <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
	card <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	<span style="color:#0000ff">PRIMARY</span> KEY(bookid)
);

<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> class(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));

<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> book(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
</code></span></span>

创建后的结果:

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> class;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> card <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">6</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">9</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">9</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">10</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">6</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">16</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">19</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">20</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span> <span style="color:#880000">21</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+</span>
<span style="color:#880000">21</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)

mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> book;
<span style="color:#ab5656">+</span><span style="color:#008000">--------+------+</span>
<span style="color:#ab5656">|</span> bookid <span style="color:#ab5656">|</span> card <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">--------+------+</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">16</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">6</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">9</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">10</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">10</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">9</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">6</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">16</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">19</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>     <span style="color:#880000">20</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">--------+------+</span>
<span style="color:#880000">20</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>

开始explain分析 两个表有主外键,索引应该加在哪张表上?

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

type都是all,需要优化,且查询的记录数量为 21+20!

为book.card创建索引

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">ALTER</span> <span style="color:#0000ff">TABLE</span> `book` <span style="color:#0000ff">ADD</span> INDEX Y(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>
</code></span></span>

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

可以看到第二行的type变为了ref,rows也变少了,优化比较明显。这是由左连接特性决定的。LEFT JOIN的特性就是左表全都有;条件用于确定如何从右表搜索行,左边一定都有,所以右边是我们的关键点,一定需要在右表建立索引。

删除为book.card创建索引

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">drop</span> index y <span style="color:#0000ff">on</span> book;
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.02</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>
</code></span></span>

为class.card创建索引

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">ALTER</span> <span style="color:#0000ff">TABLE</span> `class` <span style="color:#0000ff">ADD</span> INDEX Y(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>
</code></span></span>

再次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> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card;
</code></span></span>

可见右边是我们的关键点,要想优化需要在右表建立索引。

然后我们换用右连接RIGHT JOIN查询

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">right</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card;
</code></span></span>

换成左边是我们的关键点,要想优化需要在左表建立索引。

小结

索引两表优化,左连接右表建索引,右连接左表建索引。

③索引三表优化案例

新建SQL

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> IF <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">EXISTS</span> phone(
	phoneid <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
	card <span style="color:#a31515">INT</span>(<span style="color:#880000">10</span>) UNSIGNED <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span>,
	<span style="color:#0000ff">PRIMARY</span> KEY(phoneid)
)ENGINE<span style="color:#ab5656">=</span>INNODB;

<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> phone(card) <span style="color:#0000ff">VALUES</span>(<span style="color:#0000ff">FLOOR</span>(<span style="color:#880000">1</span><span style="color:#ab5656">+</span>(RAND()<span style="color:#ab5656">*</span><span style="color:#880000">20</span>)));
</code></span></span>

建后效果

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> phone;
<span style="color:#ab5656">+</span><span style="color:#008000">---------+------+</span>
<span style="color:#ab5656">|</span> phoneid <span style="color:#ab5656">|</span> card <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">---------+------+</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">1</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">10</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">3</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">4</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">6</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">7</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>       <span style="color:#880000">9</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">10</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">19</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">12</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">15</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">2</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">16</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">8</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">17</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">11</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">18</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">14</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">19</span> <span style="color:#ab5656">|</span>   <span style="color:#880000">13</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>      <span style="color:#880000">20</span> <span style="color:#ab5656">|</span>    <span style="color:#880000">5</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">---------+------+</span>
<span style="color:#880000">20</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>

复用到上一节book,class两表,移除它们原有的索引。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">show</span> index <span style="color:#0000ff">from</span> class;
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">drop</span> index y <span style="color:#0000ff">on</span> class;
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.02</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">show</span> index <span style="color:#0000ff">from</span> book;
</code></span></span>

为phone.card和book.card创建新的索引。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">alter</span> <span style="color:#0000ff">table</span> `phone` <span style="color:#0000ff">add</span> index z(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>

mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">alter</span> <span style="color:#0000ff">table</span> `book` <span style="color:#0000ff">add</span> index y(`card`);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.01</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>
</code></span></span>

explain三表连接 三表至少两次关联,索引应该建在哪张表上?

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> class <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> book <span style="color:#0000ff">ON</span> class.card <span style="color:#ab5656">=</span> book.card <span style="color:#0000ff">LEFT</span> <span style="color:#0000ff">JOIN</span> phone <span style="color:#0000ff">ON</span> book.card <span style="color:#ab5656">=</span> phone.card;
</code></span></span>

后2行的 type 都是ref且总 rows优化很好,效果不错。因此索引最好设置在需要经常查询的字段中。

结论

Join语句的优化

尽可能减少Join语句中的NestedLoop的循环总次数(不要join过多或者嵌套):“永远用小结果集驱动大的结果集”。

优先优化NestedLoop的内层循环,保证Join语句中被驱动表上Join条件字段已经被索引。

当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer(在my.cnf文件中)的设置。

7-索引失效

索引失效的各种原因:(应该避免)

  1. 全值匹配我最爱
  2. 最佳左前缀法则 - 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过复合索引中间列
  3. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。
  4. 存储引擎不能使用索引中范围条件右边的列。
  5. 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *。
  6. mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。
  7. is null, is not null 也无法使用索引。
  8. like以通配符开头(’%abc…’),mysql索引失效会变成全表扫描的操作。
  9. 字符串不加单引号索引失效。
  10. 少用or,用它来连接时会索引失效。

①全值匹配我最爱

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

三种情况:

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

注意下面的explain 我们建立索引的顺序是:(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>

上面两个索引失效了。如果查询字段的顺序与索引的建立的顺序不一致,需要满足最佳左前缀法则。

②最佳左前缀法则

  • 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列

带头大哥不能死! 中间兄弟不能断!

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>

ref只有一个const,说明上述其实只是使用到了部分索引,而且只是用到了第一个索引,name。

②索引列上做额外操作

不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
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>

③限定复合索引某列的范围

存储引擎不能使用索引中范围条件右边的列(我理解为限定复合索引某字段的范围会时索引失效,也就是>,<,between…and…谨慎用在复合索引某字段)。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">></span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>

由age=25变成age>25后,type从ref变成range。

④select *

尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'manager'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name,age,pos <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;
</code></span></span>

我们最好按需索取,少用select *

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name,age,pos <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name,age,pos <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">></span><span style="color:#880000">25</span> <span style="color:#0000ff">AND</span> pos<span style="color:#ab5656">=</span><span style="color:#a31515">'dev'</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> name <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">AND</span> age<span style="color:#ab5656">=</span><span style="color:#880000">25</span>;
</code></span></span>

⑤!=或者<>

mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">!=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656"><></span><span style="color:#a31515">'July'</span>;
</code></span></span>

⑥is null或者is not null

is null, is not null 也无法使用索引

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">is</span> <span style="color:#0000ff">null</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">is</span> <span style="color:#0000ff">not</span> <span style="color:#0000ff">null</span>;
</code></span></span>

Extra打印为Impossible WHERE,是因为我们在创建staffs表,设置name字段的属性为not null。

下面额外演示Extra为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以通配符%开头字符串

like以通配符%开头(’%abc…’),mysql索引失效会变成全表扫描的操作。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">like</span> <span style="color:#a31515">'%July%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">like</span> <span style="color:#a31515">'%July'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">like</span> <span style="color:#a31515">'July%'</span>;
</code></span></span>

问题:解决like '%字符串%'时索引不被使用的方法?

  • 可以使用主键索引
  • 推荐使用覆盖索引,查询字段必须是建立覆盖索引字段
  • 当覆盖索引指向的字段是varchar(380)及380以上的字段时,覆盖索引会失效!

新建SQL

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">TABLE</span> `tbl_user`(
	`id` <span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">NOT</span> <span style="color:#0000ff">NULL</span> AUTO_INCREMENT,
	`name` <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">20</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
	`age`<span style="color:#a31515">INT</span>(<span style="color:#880000">11</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
	`email` <span style="color:#a31515">VARCHAR</span>(<span style="color:#880000">20</span>) <span style="color:#0000ff">DEFAULT</span> <span style="color:#0000ff">NULL</span>,
	<span style="color:#0000ff">PRIMARY</span> KEY(`id`)
)ENGINE<span style="color:#ab5656">=</span>INNODB AUTO_INCREMENT<span style="color:#ab5656">=</span><span style="color:#880000">1</span> <span style="color:#0000ff">DEFAULT</span> CHARSET<span style="color:#ab5656">=</span>utf8;

<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'1aa1'</span>,<span style="color:#880000">21</span>,<span style="color:#a31515">'[email protected]'</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'2bb2'</span>,<span style="color:#880000">23</span>,<span style="color:#a31515">'[email protected]'</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'3cc3'</span>,<span style="color:#880000">24</span>,<span style="color:#a31515">'[email protected]'</span>);
<span style="color:#0000ff">INSERT</span> <span style="color:#0000ff">INTO</span> tbl_user(`name`,`age`,`email`)<span style="color:#0000ff">VALUES</span>(<span style="color:#a31515">'4dd4'</span>,<span style="color:#880000">26</span>,<span style="color:#a31515">'[email protected]'</span>);
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> tbl_user;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+-----------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age  <span style="color:#ab5656">|</span> email     <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+-----------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> <span style="color:#880000">1</span>aa1 <span style="color:#ab5656">|</span>   <span style="color:#880000">21</span> <span style="color:#ab5656">|</span> a<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2</span>bb2 <span style="color:#ab5656">|</span>   <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> b<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">3</span>cc3 <span style="color:#ab5656">|</span>   <span style="color:#880000">24</span> <span style="color:#ab5656">|</span> c<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> <span style="color:#880000">4</span>dd4 <span style="color:#ab5656">|</span>   <span style="color:#880000">26</span> <span style="color:#ab5656">|</span> d<span style="color:#008000">@163</span>.com <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+-----------+</span>
<span style="color:#880000">4</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>

创建索引前,先看看以下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>

没有创建索引,都全表查找。

现在创建索引

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">CREATE</span> INDEX idx_user_nameAge <span style="color:#0000ff">ON</span> tbl_user(NAME,age);
Query OK, <span style="color:#880000">0</span> <span style="color:#0000ff">rows</span> affected (<span style="color:#880000">0.02</span> sec)
Records: <span style="color:#880000">0</span>  Duplicates: <span style="color:#880000">0</span>  Warnings: <span style="color:#880000">0</span>
</code></span></span>

再执行上述一系列explain

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>

看得出,用上索引(覆盖索引)

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>

看得出,都用上索引(覆盖索引)

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;

mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> NAME,age <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>

看得出,都用上索引(覆盖索引)

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
mysql<span style="color:#ab5656">></span> EXPLAIN <span style="color:#0000ff">SELECT</span> id,NAME,age,email <span style="color:#0000ff">FROM</span> tbl_user <span style="color:#0000ff">WHERE</span> NAME <span style="color:#0000ff">LIKE</span> <span style="color:#a31515">'%aa%'</span>;
</code></span></span>

看得出,都没用上索引了,有email字段再,只能全表搜索。

2)覆盖索引(Covering Index)

一说为索引覆盖。 类比锅和锅盖,查询的字段要小于等于创建的索引 (注意:主键id天生自带索引,故而主键字段对与覆盖索引无影响)。

理解方式一:就是select的数据列只用从索引中就能够取得,不必读取数据行, MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖

理解方式二:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引。

注意:

如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select*,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。

小结

解决like '%字符串%'时索引不被使用的方法?复合索引,然后覆盖索引。

⑧数目字符串不加单引号

数目字符串不加单引号索引失效。 varchar类型一定要加单引号!!!

MySQL底层发送了隐式的类型转换,影响效率。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#880000">2000</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age <span style="color:#ab5656">|</span> pos <span style="color:#ab5656">|</span> add_time            <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2000</span> <span style="color:#ab5656">|</span>  <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> dev <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span>, <span style="color:#880000">1</span> warning (<span style="color:#880000">0.00</span> sec)

mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'2000'</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age <span style="color:#ab5656">|</span> pos <span style="color:#ab5656">|</span> add_time            <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> <span style="color:#880000">2000</span> <span style="color:#ab5656">|</span>  <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> dev <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+-----+---------------------+</span>
<span style="color:#880000">1</span> <span style="color:#a31515">row</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)

mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#880000">2000</span>;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'2000'</span>;
</code></span></span>

⑨用关键字OR

少用or,用它来连接时会索引失效

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">or</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">'z3'</span>;
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">SELECT</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">FROM</span> staffs <span style="color:#0000ff">WHERE</span> NAME<span style="color:#ab5656">=</span><span style="color:#a31515">'July'</span> <span style="color:#0000ff">or</span> name<span style="color:#ab5656">=</span><span style="color:#a31515">'z3'</span>;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+---------+---------------------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> name <span style="color:#ab5656">|</span> age <span style="color:#ab5656">|</span> pos     <span style="color:#ab5656">|</span> add_time            <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+---------+---------------------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> z3   <span style="color:#ab5656">|</span>  <span style="color:#880000">22</span> <span style="color:#ab5656">|</span> manager <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> July <span style="color:#ab5656">|</span>  <span style="color:#880000">23</span> <span style="color:#ab5656">|</span> dev     <span style="color:#ab5656">|</span> <span style="color:#880000">2021</span><span style="color:#880000">-04</span><span style="color:#880000">-03</span> <span style="color:#880000">14</span>:<span style="color:#880000">03</span>:<span style="color:#880000">18</span> <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+-----+---------+---------------------+</span>
<span style="color:#880000">2</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
</code></span></span>

⑩小总结where之后order by之前

小总结

假设 创建的索引:index(a,b,c)

Where 语句 索引是否被使用
where a = 3 Y,使用到 a
where a = 3 and b = 5 Y,使用到 a,b
where a = 3 and b = 5 and c = 4 Y,使用到 a,b,c
where b = 3 或者 where b = 3 and c = 4 或者 where c = 4 N (没有大哥a
where a = 3 and c = 5 使用到 a, 但是 c 不可以,b 中间断了
where a = 3 and b > 4 and c = 5 使用到 a 和 b, c 不能用在范围之后,b 断了
where a is null and b is not null is null 支持索引 但是 is not null 不支持,所以 a 可以使用索引,但是 b 不可以使用
where a <> 3 不能使用索引
where abs(a) =3 不能使用 索引
where a = 3 and b like 'kk%' and c = 4 Y,使用到 a,b,c
where a = 3 and b like '%kk' and c = 4 Y,只用到 a
where a = 3 and b like '%kk%' and c = 4 Y,只用到 a
where a = 3 and b like 'k%kk%' and c = 4 Y,使用到 a,b,c

优化总结口诀

全值匹配我最爱, 最左前缀要遵守;

带头大哥不能死, 中间兄弟不能断;

索引列上少计算, 范围之后全失效;

LIKE 百分写最右, 覆盖索引不写 *;

不等空值还有 OR, 索引影响要注意;

VAR 引号不可丢, SQL 优化有诀窍。

8-索引面试题分析

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-java">create table <span style="color:#a31515">test03</span>(
    id <span style="color:#a31515">int</span> primary key not <span style="color:#a31515">null</span> auto_increment,
    c1 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
    c2 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
    c3 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
    c4 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>),
    c5 <span style="color:#a31515">char</span>(<span style="color:#880000">10</span>)
);

insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'a1'</span>,<span style="color:#a31515">'a2'</span>,<span style="color:#a31515">'a3'</span>,<span style="color:#a31515">'a4'</span>,<span style="color:#a31515">'a5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'b1'</span>,<span style="color:#a31515">'b2'</span>,<span style="color:#a31515">'b3'</span>,<span style="color:#a31515">'b4'</span>,<span style="color:#a31515">'b5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'c1'</span>,<span style="color:#a31515">'c2'</span>,<span style="color:#a31515">'c3'</span>,<span style="color:#a31515">'c4'</span>,<span style="color:#a31515">'c5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'d1'</span>,<span style="color:#a31515">'d2'</span>,<span style="color:#a31515">'d3'</span>,<span style="color:#a31515">'d4'</span>,<span style="color:#a31515">'d5'</span>);
insert into <span style="color:#a31515">test03</span>(c1,c2,c3,c4,c5) values (<span style="color:#a31515">'e1'</span>,<span style="color:#a31515">'e2'</span>,<span style="color:#a31515">'e3'</span>,<span style="color:#a31515">'e4'</span>,<span style="color:#a31515">'e5'</span>);

create index idx_test03_c1234 on <span style="color:#a31515">test03</span>(c1,c2,c3,c4);
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03;
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+------+------+------+</span>
<span style="color:#ab5656">|</span> id <span style="color:#ab5656">|</span> c1   <span style="color:#ab5656">|</span> c2   <span style="color:#ab5656">|</span> c3   <span style="color:#ab5656">|</span> c4   <span style="color:#ab5656">|</span> c5   <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+------+------+------+</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">1</span> <span style="color:#ab5656">|</span> a1   <span style="color:#ab5656">|</span> a2   <span style="color:#ab5656">|</span> a3   <span style="color:#ab5656">|</span> a4   <span style="color:#ab5656">|</span> a5   <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">2</span> <span style="color:#ab5656">|</span> b1   <span style="color:#ab5656">|</span> b2   <span style="color:#ab5656">|</span> b3   <span style="color:#ab5656">|</span> b4   <span style="color:#ab5656">|</span> b5   <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">3</span> <span style="color:#ab5656">|</span> c1   <span style="color:#ab5656">|</span> c2   <span style="color:#ab5656">|</span> c3   <span style="color:#ab5656">|</span> c4   <span style="color:#ab5656">|</span> c5   <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">4</span> <span style="color:#ab5656">|</span> d1   <span style="color:#ab5656">|</span> d2   <span style="color:#ab5656">|</span> d3   <span style="color:#ab5656">|</span> d4   <span style="color:#ab5656">|</span> d5   <span style="color:#ab5656">|</span>
<span style="color:#ab5656">|</span>  <span style="color:#880000">5</span> <span style="color:#ab5656">|</span> e1   <span style="color:#ab5656">|</span> e2   <span style="color:#ab5656">|</span> e3   <span style="color:#ab5656">|</span> e4   <span style="color:#ab5656">|</span> e5   <span style="color:#ab5656">|</span>
<span style="color:#ab5656">+</span><span style="color:#008000">----+------+------+------+------+------+</span>
<span style="color:#880000">5</span> <span style="color:#0000ff">rows</span> <span style="color:#0000ff">in</span> <span style="color:#0000ff">set</span> (<span style="color:#880000">0.00</span> sec)
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">show</span> index <span style="color:#0000ff">from</span> test03;
</code></span></span>

问题:我们创建了复合索引idx_test03_c1234 (c1、c2、c3、c4) ,根据以下SQL分析下索引使用情况?

①案例1

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span>;

mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span>;

mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;

mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;
#换一下条件顺序
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span>;
</code></span></span>

为什么我建的是1、2、3、4,但是我查询的是4、3、2、1,依旧可以使用到索引呢?MySQL中的第二层中的Optimizer会把MySQL中的命令自动的进行调整和优化。。

②案例2

限定范围

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">></span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;
explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">></span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">></span><span style="color:#a31515">'a3'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span>;

mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">></span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>

③案例3

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c4<span style="color:#ab5656">=</span><span style="color:#a31515">'a4'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3;
</code></span></span>

c3作用在排序而不是查找

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3;
</code></span></span>

上面两个explain的相同。上述两条说明:和c4='a4'这个没啥关系 直接在三楼(c3)排序就行,不找了。

order by c3换成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>

用到Using filesort。中间的兄弟断了,但是MySQL要交出结果,只好整一次内排序 Using filesort

④ order by的字段顺序与索引字段的顺序

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c2,c3;
</code></span></span>

只用c1一个字段索引,但是c2、c3用于排序,无filesort。

将order by c2,c3换成order by c3,c2。

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3,c2;
</code></span></span>

出现了filesort,我们建的索引是1234,它没有按照顺序来,3,2颠倒了。

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

用c1、c2两个字段索引,但是c2、c3用于排序,无filesort 和c5='a5'没啥关系

上述第二条SQL的order by违反了创建索引的顺序,那么为什么没有产生using filesort呢?

原因是:

  • 一般情况下:只要order by字段顺序与创建索引的顺序不一致就会产生using filesort;

  • 特例是:排序的字段已经是一个常量了,上述情况就是 c3和c2='a2'两个字段排序。

对比说明:

<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2<span style="color:#ab5656">=</span><span style="color:#a31515">'a2'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3,c2;
mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c5<span style="color:#ab5656">=</span><span style="color:#a31515">'a5'</span> <span style="color:#0000ff">order</span> <span style="color:#0000ff">by</span> c3,c2;
</code></span></span>

跳过c2,就用c3,就出现Using filesort。

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

group by表面上是分组,但是分组之前必排序,所以group by优化原则几乎和order by相同

定值、范围还是排序,一般order by是给个范围

group by基本上都需要进行排序,会有临时表产生(建的索引搞不定,MySQL自己内部再次排序)

一般性建议

  • 对于单键索引,尽量选择针对当前query过滤性更好的索引。
  • 在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中,位置越靠越好。
  • 在选择组合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引。
  • 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。

9-索引优化答疑补充和总结口诀

假设index(a, b, c)

  • Y,使用到a,b,c
<span style="color:#2c2c2c"><span style="background-color:#ffffff"><code class="language-sql">#百分号在右边,相当于说左边有常量了,实际上用到了c2索引mysql<span style="color:#ab5656">></span> explain <span style="color:#0000ff">select</span> <span style="color:#ab5656">*</span> <span style="color:#0000ff">from</span> test03 <span style="color:#0000ff">where</span> c1<span style="color:#ab5656">=</span><span style="color:#a31515">'a1'</span> <span style="color:#0000ff">and</span> c2 <span style="color:#0000ff">like</span> <span style="color:#a31515">'kk%'</span> <span style="color:#0000ff">and</span> c3<span style="color:#ab5656">=</span><span style="color:#a31515">'a3'</span>;
</code></span></span>

  • Y,使用到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,使用到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,使用到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>

猜你喜欢

转载自blog.csdn.net/m0_60961651/article/details/132272812