<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>存储引擎 &#8211; 个人随笔</title>
	<atom:link href="/label/%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 19 May 2018 15:19:17 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>存储引擎 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>网站优化（一）MySQL 优化 三范式、逆范式、存储引擎、列类型、枚举、慢查询日志、索引、千万级数据优化</title>
		<link>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5395.html</link>
					<comments>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5395.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:51:14 +0000</pubDate>
				<category><![CDATA[优化方案]]></category>
		<category><![CDATA[网站优化]]></category>
		<category><![CDATA[三范式]]></category>
		<category><![CDATA[列类型]]></category>
		<category><![CDATA[千万级数据优化]]></category>
		<category><![CDATA[存储引擎]]></category>
		<category><![CDATA[慢查询日志]]></category>
		<category><![CDATA[枚举]]></category>
		<category><![CDATA[索引]]></category>
		<category><![CDATA[逆范式]]></category>
		<guid isPermaLink="false">/?p=5395</guid>

					<description><![CDATA[大型网站核心优化之MySQL优化 Nginx 问题：输入IP地址无法访问 检查步骤： 检查服务是否启动（ps  [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>大型网站核心优化之MySQL优化</h1>
<h1>Nginx</h1>
<p>
  问题：输入IP地址无法访问
</p>
<p>
  检查步骤：
</p>
<ol>
<li>
  检查服务是否启动（ps -A | grep nginx）     脚下留心：nginx支持php （/php/server/php/sbin/php-fpm）
</li>
<li>
  检查防火墙例外是否添加（vi /etc/sysconfig/iptables    service iptables stop）
</li>
<li>
  检查本机输入的网址是否指向linux服务器（在本机DOS窗口输入 ping 网址）
</li>
</ol>
<h1>复习 </h1>
<p>
  集群技术/冗余技术：多台服务器实现相同的业务
</p>
<p>
  负载均衡：将用户的请求分配给不同的服务处理
</p>
<p>
  动静分离：将静态资源脱离项目/Public目录而是单独服务器存储
</p>
<p>
  现在很多大公司都是通过对象存储存放静态资源
</p>
<p>
  主从复制：一台服务器有增/改/删时候，其它服务器会自动同步数据
</p>
<p>
  读写分离：通过php判断insert/update/delete开头则去主服务器，select则去从服务器
</p>
<p>
  CDN加速：CDN服务器供应商在全国各个城市都有一个机房，用于后期缓存静态资源，网站老板购买了CDN后，其网站用户访问时第一次去源服务器访问并缓存到用户最近的机房，下次直接去最近的机房（节点）访问。
</p>
<p>
  面试：问现在网站打开比较慢你如何优化？
</p>
<ul>
<li>
    获取网站慢SQL语句
  </li>
<li>
    读写分离、主从复制
  </li>
<li>
    开启opcode缓存
  </li>
<li>
    开启CDN加速、开启懒加载、搭建负载均衡
  </li>
<li>
    等
  </li>
</ul>
<h1>一、MySQL优化概述</h1>
<h2>1、基本概念</h2>
<p>
  上一讲说了主从复制、读写分离都是从查询角度优化、但最终必不可免的还是得操作数据库、思考如何从设计数据库角度优化？
</p>
<h2>2、优化策略</h2>
<p>
  架构：读写分离、主从复制
</p>
<p>
  设计：三范式、存储引擎、字段类型
</p>
<p>
  功能：索引、分区、缓存
</p>
<h1>二、MySQL表的设计（三范式）</h1>
<h2>1、概念</h2>
<p>
  为了建立冗余较小、结构合理的数据库，设计数据库时必须遵循一定的规则（注：这个规则在关系型数据库中称之为三范式）
</p>
<p>
  脚下留心：有些时候一味追求范式减少冗余，反而降低读写效率，这时候可以反三范式，利用空间来换时间。
</p>
<p>
  概况
</p>
<p>
  什么是三范式：就是设计数据库的规则
</p>
<p>
  三范式的好处：减少冗余，加速读写数据
</p>
<p>
  反三范式：不按规则出牌，通过冗余策略以空间换时间
</p>
<h2>2、确保每列/字段保持原子性（1NF）</h2>
<h3>1）概念</h3>
<ul>
<li>
    每列字段不可以再分
  </li>
</ul>
<h3>举例</h3>
<ul>
<li>
    案例：地区表
  </li>
</ul>
<p>
  id（编号）  address（地址）           ? 不符合因为地区可以拆分成：省市区，一个字段后期可扩展性差
</p>
<p>
  1		    北京北京朝阳区
</p>
<p>
  2			上海上海浦东新区
</p>
<p>
  3			江苏泰州海陵区
</p>
<h2>2、有主键，非主键字段依赖主键（2NF）</h2>
<h3>1）概念</h3>
<ul>
<li>
    每个表必须有一个主键自增字段
  </li>
<li>
    一个表只描述一件事
  </li>
</ul>
<h3>2）举例</h3>
<ul>
<li>
    案例1：用户表
  </li>
</ul>
<p>
  #用户表
</p>
<p>
  id（用户编号）  username（用户名）  password（密码）  刚不符合因为一个表只描述一件事
</p>
<p>
  #收货地址表
</p>
<p>
  address（收货详细地址） tel（联系人电话）  用户编号
</p>
<ul>
<li>
    案例2：订单表
  </li>
</ul>
<p>
  订单编号    订单总价    订单总数量  所属用户    产品ID   产品名称   产品单价   &#8230;
</p>
<p>
  1			20			2           1          1         xxx        10
</p>
<p>
  2			20			2           1          1         xxx        10
</p>
<p>
  订单（主）
</p>
<p>
  订单编号  订单总价   订单总数量  所属用户
</p>
<p>
  订单（从） 产品
</p>
<p>
  ID   订单主表编号   产品ID   产品单价 &#8230;&#8230;&#8230;
</p>
<h2>3、消除传递依赖，非主键字段不能相互依赖（3NF）     </h2>
<h3>1）概念</h3>
<ul>
<li>
    一个表不能包含其他表的非主键字段（一个表只能包含其他表的主键）
  </li>
</ul>
<h3>2）举例</h3>
<p>
  #文章表
</p>
<p>
  文章编号   文章标题   文章内容  用户ID  <s>用户姓名 </s>（文章表不能包含其他表的非主键字段，所以用户名移除，后期需要获取文章的作者，直接通过多表查询即可）
</p>
<p>
  #用户表
</p>
<p>
  用户ID    用户姓名   用户年龄 &#8230;
</p>
<h2>4、逆范式</h2>
<h3>1）概念</h3>
<p>
  符合范式设计是为了减少冗余提高读写效率，但有时候我们需要反其道而为之，利用空间来换时间（数据冗余策略），该设计被称之为“逆范式”
</p>
<h3>2）举例</h3>
<ul>
<li>
    案例1：
  </li>
</ul>
<p>
  【场景】查看文章详情，评论总数
</p>
<p>
  【表】
</p>
<p>
  #文章表
</p>
<p>
  编号     标题    内容   评论总数&#8230;
</p>
<p>
  #评论表
</p>
<p>
  编号    所属用户 所属文章  评论内容 &#8230;.
</p>
<p>
  正常流：select count(*) from 评论表 where article_id = 文章ID
</p>
<p>
  逆范式：再文章表增加一个字段（评论总数），每次用户评论成功后，给文章表的评论总数字段+1
</p>
<ul>
<li>
    案例2：
  </li>
</ul>
<p>
  收货地址表
</p>
<p>
  编号  姓名  省   市/区   乡镇    详细地址   &#8230;.
</p>
<p>
  1    你爸爸 阿富汗 xxx  xxx
</p>
<p>
  2    杨文杰
</p>
<p>
  3    娇娇
</p>
<p>
  订单（主表）
</p>
<p>
  订单ID   总价   数量   		  订单状态		    支付状态      收货地址表编号&#8230; （不合理，因为后期用户在发货的时候删除或者修改，再找商家麻烦，问题就大了，解决采用冗余策略）
</p>
<p>
  1 		 1000000000    1     已发货，待收货   已支付       1
</p>
<p>
  订单（从表）
</p>
<p>
  商品ID   商品名称   商品价格   &#8230;
</p>
<p>
  订单（收货地址表）
</p>
<p>
  姓名   省   市/区   乡镇    详细地址
</p>
<h2>︴总结</h2>
<ul>
<li>
    什么是三范式：就是设计表的规则
  </li>
<li>
    三范式好处：减少冗余，提高读写效率
  </li>
<li>
    三范式有哪些：
  </li>
</ul>
<ol>
<li>
  每个字段不可以拆分
</li>
<li>
  每个表必须有主键自增、每个表只描述一件事
</li>
<li>
  一个表不能包含其他表的非主键字段
</li>
</ol>
<ul>
<li>
    逆范式：反三范式规则、以空间换时间（冗余策略）
  </li>
</ul>
<h2>︴说明</h2>
<p>
  前期别想太多根据页面显示数据设计表（一般一个显示对应一个字段）
</p>
<p>
  其次常用字段推荐：
</p>
<p>
  1）编号，主键自增
</p>
<p>
  2）创建于，便于后期数据赛选统计
</p>
<p>
  3）更新于，便于后期数据赛选统计
</p>
<p>
  4）是否显示，便于逻辑删除数据
</p>
<h1>三、存储引擎</h1>
<h2>1、什么是存储引擎</h2>
<ul>
<li>
    说明：
  </li>
</ul>
<p>
  MySQL中按照一定的数据格式来保存最终的数据，通过存储引擎来指定哪种方式存储方案。
</p>
<ul>
<li>
    常用的存储引擎：innodb  和 myisam
  </li>
<li>
    查看当前MySQL支持的存储引擎列表：show engines;
  </li>
</ul>
<p><img fetchpriority="high" decoding="async" width="800" height="298" src="/wp-content/uploads/2018/05/word-image-4883.png" class="wp-image-5396" srcset="/wp-content/uploads/2018/05/word-image-4883.png 800w, /wp-content/uploads/2018/05/word-image-4883-300x112.png 300w, /wp-content/uploads/2018/05/word-image-4883-768x286.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<h2>2、myisam存储引擎</h2>
<h3>1）概念</h3>
<p>
  &lt;= 5.5 MySQL默认的存储引擎。
</p>
<p>
  如果应用是以读操作和插入操作为主，只有很少的更新和删除操作，并且
</p>
<p>
  对事务的完整性要求不是很高；其优势是访问的速度快，擅长与处理高速读与写。
</p>
<h3>应用场景</h3>
<p>
  对事务完整性要求不高，不涉及钱的表
</p>
<h3>3）存储方式</h3>
<ul>
<li>
    创建数据库：create database d1;
  </li>
<li>
    说明：创建数据库会在MySQL的data目录下创建同名文件夹
  </li>
</ul>
<p><img decoding="async" width="1057" height="423" src="/wp-content/uploads/2018/05/word-image-4884.png" class="wp-image-5397" srcset="/wp-content/uploads/2018/05/word-image-4884.png 1057w, /wp-content/uploads/2018/05/word-image-4884-300x120.png 300w, /wp-content/uploads/2018/05/word-image-4884-768x307.png 768w, /wp-content/uploads/2018/05/word-image-4884-1024x410.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" /></p>
<ul>
<li>
    创建myisam表：
  </li>
<li>
    create table t1(id int primary key auto_increment)engine=myisam charset=utf8;
  </li>
</ul>
<p><img decoding="async" width="1073" height="483" src="/wp-content/uploads/2018/05/word-image-4885.png" class="wp-image-5398" srcset="/wp-content/uploads/2018/05/word-image-4885.png 1073w, /wp-content/uploads/2018/05/word-image-4885-300x135.png 300w, /wp-content/uploads/2018/05/word-image-4885-768x346.png 768w, /wp-content/uploads/2018/05/word-image-4885-1024x461.png 1024w" sizes="(max-width: 1073px) 100vw, 1073px" /></p>
<h2>3、innodb存储引擎</h2>
<h3>1）概念</h3>
<p>
  &gt;=5.5 默认的存储引擎，MySQL推荐使用的存储引擎。
</p>
<p>
  提供事务，行级锁定，外键约束的存储引擎。
</p>
<p>
  事务安全型存储引擎。更加注重数据的完整性和安全性。
</p>
<h3>2）应用场景</h3>
<p>
  订单、账户、积分等
</p>
<h3>3）存储方式</h3>
<ul>
<li>
    创建innodb存储引擎数据库：
  </li>
<li>
    create table t2 (id int primary key auto_increment)engine=innodb charset=utf8;
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="960" height="396" src="/wp-content/uploads/2018/05/word-image-4886.png" class="wp-image-5399" srcset="/wp-content/uploads/2018/05/word-image-4886.png 960w, /wp-content/uploads/2018/05/word-image-4886-300x124.png 300w, /wp-content/uploads/2018/05/word-image-4886-768x317.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img loading="lazy" decoding="async" width="735" height="396" src="/wp-content/uploads/2018/05/word-image-4887.png" class="wp-image-5400" srcset="/wp-content/uploads/2018/05/word-image-4887.png 735w, /wp-content/uploads/2018/05/word-image-4887-300x162.png 300w" sizes="(max-width: 735px) 100vw, 735px" /></p>
<p>
  多学一招：
</p>
<p>
  myisam因为结构、索引、数据都存放在数据库文件夹下，所以可以直接复制迁移，而innodb都存在ib_logfile数字文件中，在存储的时候记录了使那个数据的表，所以后期无法迁移。
</p>
<h2>Archive存储引擎（存档型）</h2>
<h3>1）说明</h3>
<p>
  该类型只能插入和读取不能修改和删除。
</p>
<h3>举例</h3>
<p><img loading="lazy" decoding="async" width="800" height="370" src="/wp-content/uploads/2018/05/word-image-4888.png" class="wp-image-5401" srcset="/wp-content/uploads/2018/05/word-image-4888.png 800w, /wp-content/uploads/2018/05/word-image-4888-300x139.png 300w, /wp-content/uploads/2018/05/word-image-4888-768x355.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<h3>应用场景</h3>
<p>
  网站管理员操作日志
</p>
<h2>5、Memory存储引擎（内存型）</h2>
<p>
  简单了解，该类型将数据保存在内存（后期通过通过memcache、redis软件代替）
</p>
<p>
  内存存储 &gt; 文件缓存  &gt; 数据库存储
</p>
<h2>6、MyIsam和InnoDB存储引擎区别（面试笔试）</h2>
<ul>
<li>
    存储结构：myisam三个文件，innodb一个文件
  </li>
<li>
    锁：myisam表级锁，innodb可表可行级锁
  </li>
<li>
    事物和外键支持：innodb都支持，myisam都不支持
  </li>
<li>
    CURD操作：
  </li>
</ul>
<p>
  MyISAM：如果执行大量的SELECT，MyISAM是更好的选择。
</p>
<p>
  InnoDB：如果你的数据执行大量的INSERT或UPDATE，出于性能方面的考虑，应该使用InnoDB表。DELETE 从性能上InnoDB更优，但DELETE FROM table时，InnoDB不会重新建立表，而是一行一行的删除，在innodb上如果要清空保存有大量数据的表，最好使用truncate table这个命令。
</p>
<ul>
<li>
    全文检索：MySQL5.6以下innodb不支持（都不支持中文）
  </li>
</ul>
<h1>列类型的选择	</h1>
<h2>概念</h2>
<h3>1）“字节”的定义</h3>
<ul>
<li>
    字节（Byte）是一种计量单位，表示数据量多少，它是计算机信息技术用于计量存
  </li>
</ul>
<p>
  储容量的一种计量单位。
</p>
<p>
  1字节（Byte）= 8位（bit）
</p>
<p>
  1KB = 1024Byte（字节）
</p>
<p>
  1MB = 1024KB
</p>
<p>
  1GB =  1024MB
</p>
<p>
  1TB =  1024GB
</p>
<h3>2）字节和字符的区别</h3>
<p><a href="https://zhidao.baidu.com/question/454436588167256525.html">https://zhidao.baidu.com/question/454436588167256525.html</a>
</p>
<p>
  英文：1个字符 = 1个字节
</p>
<p>
  中文：1个字符 = 等于3个字节
</p>
<h3>MySQL类型字符和字节相关细节</h3>
<p>
  整型    字节
</p>
<p>
  char     范围：字符   括号中的数字：字符
</p>
<p>
  varchar   范围：字节   括号中的数字：字符
</p>
<h2>1、为什么要学习列类型优化</h2>
<p>
  以前的时候都是直接凭感觉选择字段，这样就造成了两个问题
</p>
<p>
  1）浪费磁盘空间
</p>
<p>
  2）降低读写效率
</p>
<h2><a id="post-5395-_Toc448678239"></a>2、整型</h2>
<h3>1）说明</h3>
<p><img loading="lazy" decoding="async" width="759" height="303" src="/wp-content/uploads/2018/05/word-image-4889.png" class="wp-image-5402" srcset="/wp-content/uploads/2018/05/word-image-4889.png 759w, /wp-content/uploads/2018/05/word-image-4889-300x120.png 300w" sizes="(max-width: 759px) 100vw, 759px" /><br />
<img loading="lazy" decoding="async" width="560" height="201" src="/wp-content/uploads/2018/05/word-image-4890.png" class="wp-image-5403" srcset="/wp-content/uploads/2018/05/word-image-4890.png 560w, /wp-content/uploads/2018/05/word-image-4890-300x108.png 300w" sizes="(max-width: 560px) 100vw, 560px" /></p>
<h3>︴案例</h3>
<ul>
<li>
    存储人的年龄应该使用哪种数据类型？
  </li>
</ul>
<p>
  答：tinyint（3）
</p>
<p>
  整型括号中的数字仅仅只有增加zerofill属性时才生效，表示插入数据如果不够宽度则补零
</p>
<p>
  误区1：tinyint（1） 不能插入1位以上数字    错
</p>
<p>
  误区2：tinyint（3） 占1个字节
</p>
<p>
  年龄：tinyint（3）
</p>
<p>
  性别：tinyint（1）
</p>
<p>
  声明如果没有明确zerofill属性则两者没有区别，但是为什么年龄写3，性别写1呢？目的：增强代码可读性
</p>
<ul>
<li>
    存储乌龟的年龄应该使用哪种数据类型？（千年王八万年龟）
  </li>
</ul>
<p>
  答：smallint
</p>
<ul>
<li>
    存储一个1500万数据的数据表其主键id应该选择哪种数据类型？
  </li>
</ul>
<p>
  答：int
</p>
<h2>3、字符串型</h2>
<h3>1）说明</h3>
<p>
  char    固定字符串类型（0-255个字符）
</p>
<p>
  varchar 可变字符串类型（0-65535个字节） utf8字符：65535/3=21845
</p>
<p>
  char（字符）
</p>
<p>
  varchar（字符）   utf8=21845个字符   gbk=32767个字符
</p>
<p>
  字符表示：任意中文、数字、英文组合插入不能超过指定字符即可，如：char（3）表示可以插入任意3个英文、数字、中文组合。
</p>
<h3>︴案例</h3>
<ul>
<li>
    存储11位手机号码，选择？
  </li>
</ul>
<p>
  答：char(11）   说明：从效率占用空间选择bigint，但是从可扩展性选择char
</p>
<p>
  bigint  8个字节 （int不能4个字节，最大长度10位）
</p>
<p>
  char(11)  代表11个字符，utf8=因为数字11个字节
</p>
<ul>
<li>
    存储md5加密的密码，选择？
  </li>
</ul>
<p>
  答：char（32）    因为php的md5加密32位
</p>
<p><a href="http://www.cmd5.com/">http://www.cmd5.com/</a> 在线破解
</p>
<ul>
<li>
    存储标题或姓名，选择？
  </li>
</ul>
<p>
  答：varchar（45）
</p>
<p>
  标题推荐80有利于seo优化（seo优化指：在百度输入你的名字可以找到你）
</p>
<p><a href="http://seo.chinaz.com/?q=www.itcast.cn">http://seo.chinaz.com/?q=www.itcast.cn</a>
</p>
<p><img loading="lazy" decoding="async" width="1164" height="252" src="/wp-content/uploads/2018/05/word-image-4891.png" class="wp-image-5404" srcset="/wp-content/uploads/2018/05/word-image-4891.png 1164w, /wp-content/uploads/2018/05/word-image-4891-300x65.png 300w, /wp-content/uploads/2018/05/word-image-4891-768x166.png 768w, /wp-content/uploads/2018/05/word-image-4891-1024x222.png 1024w" sizes="(max-width: 1164px) 100vw, 1164px" /></p>
<ul>
<li>
    存储描述信息（不超过250个汉字），选择？
  </li>
</ul>
<p>
  答：varchar(200）
</p>
<ul>
<li>
    存储文章内容，选择？
  </li>
</ul>
<p>
  答：text
</p>
<h2>时间类型</h2>
<table>
<tr>
<td>
<p>
  数据类型
</p>
</td>
<td>
<p>
  描述
</p>
</td>
<td>
<p>
  格式
</p>
</td>
<td>
<p>
  占用字节
</p>
</td>
</tr>
<tr>
<td>
<p>
  datetime
</p>
</td>
<td>
<p>
  日期时间  
</p>
</td>
<td>
<p>
  年-月-日 小时:分钟:秒
</p>
</td>
<td>
<p>
  8
</p>
</td>
</tr>
<tr>
<td>
<p>
  date
</p>
</td>
<td>
<p>
  日期
</p>
</td>
<td>
<p>
  年-月-日
</p>
</td>
<td>
<p>
  4
</p>
</td>
</tr>
<tr>
<td>
<p>
  time
</p>
</td>
<td>
<p>
  时间
</p>
</td>
<td>
<p>
  小时:分钟:秒
</p>
</td>
<td>
<p>
  3
</p>
</td>
</tr>
<tr>
<td>
<p>
  year
</p>
</td>
<td>
<p>
  年份
</p>
</td>
<td>
<p>
  年
</p>
</td>
<td>
<p>
  1
</p>
</td>
</tr>
<tr>
<td>
<p>
  timestamp
</p>
</td>
<td>
<p>
  时间戳
</p>
</td>
<td>
<p>
  年-月-日 小时:分钟:秒
</p>
</td>
<td>
<p>
  4
</p>
</td>
</tr>
</table>
<ul>
<li>
    在实际工作中推荐使用int类型
  </li>
</ul>
<p>
  原因1：空间（int占4  datetime占8个字节）
</p>
<p>
  原因2：格式（2013年11月、2013/11/11、2013-11-4、【刚刚 1分钟前 一年前】）
</p>
<p>
  多说两句
</p>
<ol>
<li>
  任然有部分小公司使用datetime类型
</li>
<li>
  int类型最大存储时间2038年
</li>
</ol>
<h2><a id="post-5395-_Toc448678242"></a>5、枚举类型与集合类型</h2>
<p>
  在实际应用中，如果程序中有单选或多选情况，不建议使用varchar类型，而建议使用枚举类型或集合类型 或  用整型代替。
</p>
<p>
  enum: 枚举单选 enum(&#8216;男&#8217;, &#8216;女&#8217;, &#8216;保密&#8217;)
</p>
<p>
  set: 集合多选 set(&#8216;语文&#8217;, &#8216;英语&#8217;, &#8216;物理&#8217;)
</p>
<p>
  说明：实际工作中推荐使用int
</p>
<p>
  原因：因为enum是mysql独有的，可扩展想不强（不能迁移）
</p>
<p>
  性别：tinyint（1） 性别:1-男,2-女
</p>
<p>
  场景：查询user表所有男生
</p>
<p>
  以前：select * from user where sex = 1;
</p>
<p>
  框架：D(&#8216;user&#8217;)-&gt;where(&#8216;sex = 1&#8217;)-&gt;select();
</p>
<p>
  优化：
</p>
<p>
  步骤1：在模型中定义常量
</p>
<p>
  const SEX_MAN = 1；
</p>
<p>
  const SEX_WOMEN = 2;
</p>
<p>
  步骤2：查询
</p>
<p>
  D(&#8216;user&#8217;)-&gt;where(&#8216;sex = &#8216;.USER::SEX_MAN)-&gt;select();
</p>
<p>
  &lt;?php
</p>
<p>
  //订单类
</p>
<p>
  class Order
</p>
<p>
  {
</p>
<p>
      const STATE_WAIT_TO_PAY = 1;       // 待支付
</p>
<p>
      const STATE_PAID_SUCCESS = 2;      // 已支付（成功）
</p>
<p>
      const STATE_PAID_TIMEOUT = 5;      // 已支付（超时）
</p>
<p>
      const STATE_PAID_CANCEL = 8;       // 已付款（但在通知到来前取消）
</p>
<p>
      const STATE_TIMEOUT = 7;           // 超时未支付
</p>
<p>
      const STATE_CANCELED = 6;          // 已取消
</p>
<p>
      const STATE_REFUNDED = 9;          // 已退款
</p>
<p>
  }
</p>
<p>
  state：1-xxx,2-xxxx,3-xxx
</p>
<p>
  select * from Order where state = 2   需要打开数据库看
</p>
<p>
  select * from Order where state = Order::STATE_WAIT_TO_PAY   增强代码可读性
</p>
<h2>6、数值型（小数）</h2>
<ul>
<li>
    decimal、float、double都是小数，decimal相对后两个更精确但是占用空间
  </li>
<li>
    未涉及到资金小数可以用浮点型（float或double） 优先用float
  </li>
<li>
    涉及资金用decimal（注：decimal小数位一般2位如果没有小数会用0自动补充）
  </li>
<li>
      decimal（10, 2）
  </li>
</ul>
<h2>7、IP类型数据的存储</h2>
<ul>
<li>
    ip选择整型
  </li>
</ul>
<p>
  XXX.XXX.XXX.XXX   char（15字符串 15字节）
</p>
<p>
  ip2long
</p>
<p>
  long2ip		  int            4字节
</p>
<h1>五、慢查询日志（查询需要优化的SQL语句）</h1>
<h2>1、作用</h2>
<p>
  思考：新人加入，项目中编写SQL语句可能存在问题，问如何检查
</p>
<p>
  解决：通过慢查询日志（在MySQL中修改配置文件，从而可以记录查询找过指定是按的SQL语句）
</p>
<h2>2、测试SQL语句</h2>
<p>
  #创建表
</p>
<p>
  create table php_slow_log2 (
</p>
<p>
  name varchar(300),
</p>
<p>
  name2 varchar(300)
</p>
<p>
  )engine=innodb charset=utf8;
</p>
<p>
  #插入数据
</p>
<p>
  insert into php_slow_log2 values
</p>
<p>
  (&#8216;zzzzzz&#8217;,&#8217;zzzzzz&#8217;),
</p>
<p>
  (&#8216;zzzzzz&#8217;,&#8217;zzzzzz&#8217;),
</p>
<p>
  (&#8216;zzzzzz&#8217;,&#8217;zzzzzz&#8217;),
</p>
<p>
  (&#8216;zzzzzz&#8217;,&#8217;zzzzzz&#8217;);
</p>
<p>
  #Mysql蠕虫复制
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<p>
  insert into php_slow_log2(name,name2)  select name,name2 from php_slow_log2;
</p>
<h2>3、实际操作</h2>
<h3>1） 使用如下指令查看慢查询日志是否开启</h3>
<p><img loading="lazy" decoding="async" width="722" height="156" src="/wp-content/uploads/2018/05/word-image-4892.png" class="wp-image-5405" srcset="/wp-content/uploads/2018/05/word-image-4892.png 722w, /wp-content/uploads/2018/05/word-image-4892-300x65.png 300w" sizes="(max-width: 722px) 100vw, 722px" /></p>
<h3>2） 手工开启慢查询日志</h3>
<p><img loading="lazy" decoding="async" width="568" height="350" src="/wp-content/uploads/2018/05/word-image-4893.png" class="wp-image-5406" srcset="/wp-content/uploads/2018/05/word-image-4893.png 568w, /wp-content/uploads/2018/05/word-image-4893-300x185.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></p>
<h3>3） 设置查询的临界时间（查询超过指定时间后纪录）</h3>
<p><img loading="lazy" decoding="async" width="521" height="421" src="/wp-content/uploads/2018/05/word-image-4894.png" class="wp-image-5407" srcset="/wp-content/uploads/2018/05/word-image-4894.png 521w, /wp-content/uploads/2018/05/word-image-4894-300x242.png 300w" sizes="(max-width: 521px) 100vw, 521px" /></p>
<h3>4） 使用查询语句（超时）</h3>
<p><img loading="lazy" decoding="async" width="1126" height="464" src="/wp-content/uploads/2018/05/word-image-4895.png" class="wp-image-5408" srcset="/wp-content/uploads/2018/05/word-image-4895.png 1126w, /wp-content/uploads/2018/05/word-image-4895-300x124.png 300w, /wp-content/uploads/2018/05/word-image-4895-768x316.png 768w, /wp-content/uploads/2018/05/word-image-4895-1024x422.png 1024w" sizes="(max-width: 1126px) 100vw, 1126px" /></p>
<h3>︴总结</h3>
<p>
  步骤1：开启慢查询日志
</p>
<p>
  set global slow_query_log = 1;
</p>
<p>
  查看是否开启：show variables like &#8216;slow_query%&#8217;;
</p>
<p>
  步骤2：设置时间
</p>
<p>
  set global long_query_time = 2;  #注：2秒
</p>
<p>
  查看时间：show variables like &#8216;%query_time&#8217;;
</p>
<p>
  步骤3：关闭当前DOS窗口重新登录执行慢SQL语句，查看文件是否记录即可
</p>
<h1><a id="post-5395-_Toc448678249"></a>六、数据库设计中的索引</h1>
<h2><a id="post-5395-_Toc448678250"></a>1、什么是索引</h2>
<p>
  索引相当于书目录，加快访问速度
</p>
<h2><a id="post-5395-_Toc448678251"></a>2、现实生活中的索引</h2>
<p><img loading="lazy" decoding="async" width="551" height="389" src="/wp-content/uploads/2018/05/word-image-4896.png" class="wp-image-5409" srcset="/wp-content/uploads/2018/05/word-image-4896.png 551w, /wp-content/uploads/2018/05/word-image-4896-300x212.png 300w" sizes="(max-width: 551px) 100vw, 551px" /></p>
<h2>3、索引的好处</h2>
<ul>
<li>
    好处：加快访问速度
  </li>
<li>
    坏处：
  </li>
</ul>
<ol>
<li>
  索引占用磁盘空间
</li>
<li>
  索引会影响SQL语句执行速度，因为增加/修改都需要更新索引
</li>
</ol>
<p>
  索引可以加快查询效率，但是也不能滥用索引，否则适得其反
</p>
<h2><a id="post-5395-_Toc448678252"></a>4、四种索引形式</h2>
<p>
  普通索引（index）      &#8211;  仅仅为了加快查询速度
</p>
<p>
  唯一索引（unique）     &#8211;  保证数据唯一性
</p>
<p>
  主键索引（primary key） &#8211;  既保证数据唯一不能为null
</p>
<p>
  全文检索（fulltext）		  &#8211;  提取指定字段的关键字，添加索引
</p>
<p>
  组合索引					  &#8211;  同时给两个字段设置相同的索引
</p>
<h2>5、建表时创建索引</h2>
<p>
  #【需求】
</p>
<p>
  编号  &#8211;  主键索引
</p>
<p>
  姓名  &#8211;  唯一索引
</p>
<p>
  密码  &#8211;  普通索引
</p>
<p>
  a和b &#8211; 复合/组合索引
</p>
<p>
  info  &#8211; 全文索引
</p>
<p>
  #【创建索引表】
</p>
<p>
  create table stu1(
</p>
<p>
  id int unsigned auto_increment,
</p>
<p>
  uname varchar(30) not null comment &#8216;用户名&#8217;,
</p>
<p>
  pwd   char(32) not null comment &#8216;密码&#8217;,
</p>
<p>
  a varchar(30) not null,
</p>
<p>
  b varchar(30) not null,
</p>
<p>
  info text,
</p>
<p>
  ？？？？？
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  #【查看索引表】
</p>
<p>
  create table stu1(
</p>
<p>
  id int unsigned auto_increment,
</p>
<p>
  uname varchar(30) not null comment &#8216;用户名&#8217;,
</p>
<p>
  pwd   char(32) not null comment &#8216;密码&#8217;,
</p>
<p>
  a varchar(30) not null,
</p>
<p>
  b varchar(30) not null,
</p>
<p>
  info text,
</p>
<p>
  primary key(id),
</p>
<p>
  unique (uname),
</p>
<p>
  index (pwd),
</p>
<p>
  index (a,b),
</p>
<p>
  fulltext (info)
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p><img loading="lazy" decoding="async" width="474" height="310" src="/wp-content/uploads/2018/05/word-image-4897.png" class="wp-image-5410" srcset="/wp-content/uploads/2018/05/word-image-4897.png 474w, /wp-content/uploads/2018/05/word-image-4897-300x196.png 300w" sizes="(max-width: 474px) 100vw, 474px" /></p>
<h2>修改表的结构增加索引 和 删除索引</h2>
<h3>1）需求</h3>
<p>
  create table user2 (
</p>
<p>
  id int unsigned ,
</p>
<p>
  uname varchar(30) not null comment &#8216;姓名&#8217;,
</p>
<p>
  pwd char(32) not null comment &#8216;密码&#8217;,
</p>
<p>
  a varchar(10) not null comment &#8216;a&#8217;,
</p>
<p>
  b varchar(10) not null comment &#8216;b&#8217;,
</p>
<p>
  info text
</p>
<p>
  )engine=MyISAM charset=utf8;
</p>
<h3>2）语法				</h3>
<ul>
<li>
    修改表添加索引：alter table 表名 add 索引类型 索引名(待添加索引字段)
  </li>
<li>
    删除表指定索引：drop index 索引名 on 表名
  </li>
</ul>
<p>
  索引名字推荐使用字段名+索引名
</p>
<h3>3）SQL语句</h3>
<p>
  #【需求】
</p>
<p>
  编号  &#8211;  主键索引
</p>
<p>
  姓名  &#8211;  唯一索引
</p>
<p>
  密码  &#8211;  普通索引
</p>
<p>
  a和b &#8211; 复合/组合索引
</p>
<p>
  info  &#8211; 全文索引
</p>
<p>
  #【创建索引】
</p>
<p>
  alter table user2 add primary key  id(id);
</p>
<p>
  alter table user2 add unique  uname(uname);
</p>
<p>
  alter table user2 add index pwd(pwd);
</p>
<p>
  alter table user2 add index a_b(a,b);
</p>
<p>
  alter table user2 add fulltext info(info);
</p>
<p>
  #【删除索引】
</p>
<p><img loading="lazy" decoding="async" width="435" height="503" src="/wp-content/uploads/2018/05/word-image-4898.png" class="wp-image-5411" srcset="/wp-content/uploads/2018/05/word-image-4898.png 435w, /wp-content/uploads/2018/05/word-image-4898-259x300.png 259w" sizes="(max-width: 435px) 100vw, 435px" /></p>
<h2>7、创建索引原则</h2>
<p>
  用于频繁搜索的列
</p>
<p>
  用于排序的字段
</p>
<p>
  做条件查询的列
</p>
<p>
  给字段数据尽量不重复的字段添加索引，如：编号
</p>
<h1>七、千万级数据量根据索引优化查询速度</h1>
<h1>八、MySQL中的执行计划</h1>
<h2>SQL</h2>
<p>
  #创建数据库
</p>
<p>
  create database php666;
</p>
<p>
  #选择数据库
</p>
<p>
  use php666;
</p>
<p>
  #创建表
</p>
<p>
  create table stu (
</p>
<p>
  id int unsigned primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  name varchar(10) not null comment &#8216;姓名&#8217;,
</p>
<p>
  sex char(2) not null default &#8216;男&#8217; comment &#8216;性别&#8217;,
</p>
<p>
  age tinyint(3) not null default 0 comment &#8216;年龄&#8217;,
</p>
<p>
  money decimal(10,2) not null default 0 comment &#8216;资金&#8217;,
</p>
<p>
  address varchar(200) default &#8221; comment &#8216;地址&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  #学生数据插入
</p>
<p>
  insert into stu
</p>
<p>
  values
</p>
<p>
  (null,&#8217;小泽&#8217;,&#8217;男&#8217;,18,30.56,&#8217;北京&#8217;),
</p>
<p>
  (null,&#8217;苍苍&#8217;,&#8217;男&#8217;,40,80,&#8217;日本&#8217;),
</p>
<p>
  (null,&#8217;小白&#8217;,&#8217;男&#8217;,30,10,&#8217;哈尔滨&#8217;),
</p>
<p>
  (null,&#8217;小黑&#8217;,&#8217;男&#8217;,18,76,&#8217;黑龙江&#8217;),
</p>
<p>
  (null,&#8217;小弟弟&#8217;,&#8217;女&#8217;,18,76,&#8217;北京&#8217;),
</p>
<p>
  (null,&#8217;老陆&#8217;,&#8217;女&#8217;,88,44,&#8217;上海&#8217;),
</p>
<p>
  (null,&#8217;校长&#8217;,&#8217;男&#8217;,100,20,&#8217;上海&#8217;);
</p>
<p>
  #分数表
</p>
<p>
  create table score (
</p>
<p>
  stu_id int unsigned comment &#8216;关联学生表ID&#8217;,
</p>
<p>
  id int unsigned primary key auto_increment comment &#8216;分数表ID&#8217;,
</p>
<p>
  math int unsigned not null comment &#8216;数学&#8217;,
</p>
<p>
  chinese int unsigned not null comment &#8216;语文&#8217;,
</p>
<p>
  english int unsigned not null comment &#8216;英语&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  #分数数据插入
</p>
<p>
  insert into score
</p>
<p>
  values
</p>
<p>
  (1,null,80,58,99),
</p>
<p>
  (2,null,11,99,29),
</p>
<p>
  (3,null,32,53,89),
</p>
<p>
  (4,null,99,28,99),
</p>
<p>
  (5,null,77,68,19),
</p>
<p>
  (6,null,33,18,29);
</p>
<h2>1、什么是MySQL中执行计划</h2>
<p>
  就是通过explain关键词分析SQL语句
</p>
<h2>2、explain语法</h2>
<p>
  使用：直接explain后面写SQL语句
</p>
<p>
  语法：explain  SQL语句  \G
</p>
<p>
  说明：\G后面不需要加分号
</p>
<h2>3、使用explain执行计划分析</h2>
<h3>1）说明</h3>
<p><img loading="lazy" decoding="async" width="542" height="250" src="/wp-content/uploads/2018/05/word-image-4899.png" class="wp-image-5412" srcset="/wp-content/uploads/2018/05/word-image-4899.png 542w, /wp-content/uploads/2018/05/word-image-4899-300x138.png 300w" sizes="(max-width: 542px) 100vw, 542px" /></p>
<p>
  select_type              &#8211;  查询类型
</p>
<p>
  table               		 &#8211;  表名
</p>
<p>
  type                      &#8211;  连接所使用的类型
</p>
<p>
  possible_keys           &#8211;  可能使用的索引
</p>
<p>
  key                        &#8211;   实际使用索引
</p>
<p>
  key_len		    				&#8211;   索引长度
</p>
<p>
  rows                      &#8211;  可能需要检索的行数
</p>
<h3>2）分析，查询类型（select_type）</h3>
<p><img loading="lazy" decoding="async" width="625" height="373" src="/wp-content/uploads/2018/05/word-image-4900.png" class="wp-image-5413" srcset="/wp-content/uploads/2018/05/word-image-4900.png 625w, /wp-content/uploads/2018/05/word-image-4900-300x179.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<p>
  #情况1：simple
</p>
<p><img loading="lazy" decoding="async" width="434" height="158" src="/wp-content/uploads/2018/05/word-image-4901.png" class="wp-image-5414" srcset="/wp-content/uploads/2018/05/word-image-4901.png 434w, /wp-content/uploads/2018/05/word-image-4901-300x109.png 300w" sizes="(max-width: 434px) 100vw, 434px" /></p>
<p>
  #情况2：subquery
</p>
<p><img loading="lazy" decoding="async" width="614" height="186" src="/wp-content/uploads/2018/05/word-image-4902.png" class="wp-image-5415" srcset="/wp-content/uploads/2018/05/word-image-4902.png 614w, /wp-content/uploads/2018/05/word-image-4902-300x91.png 300w" sizes="(max-width: 614px) 100vw, 614px" /></p>
<p>
  #情况3：derived
</p>
<p><img loading="lazy" decoding="async" width="779" height="141" src="/wp-content/uploads/2018/05/word-image-4903.png" class="wp-image-5416" srcset="/wp-content/uploads/2018/05/word-image-4903.png 779w, /wp-content/uploads/2018/05/word-image-4903-300x54.png 300w, /wp-content/uploads/2018/05/word-image-4903-768x139.png 768w" sizes="(max-width: 779px) 100vw, 779px" /></p>
<p>
  #情况4：union
</p>
<p><img loading="lazy" decoding="async" width="484" height="212" src="/wp-content/uploads/2018/05/word-image-4904.png" class="wp-image-5417" srcset="/wp-content/uploads/2018/05/word-image-4904.png 484w, /wp-content/uploads/2018/05/word-image-4904-300x131.png 300w" sizes="(max-width: 484px) 100vw, 484px" /></p>
<h3>3）分析，表名（table）</h3>
<p>
  #情况1：实际表名
</p>
<p><img loading="lazy" decoding="async" width="696" height="139" src="/wp-content/uploads/2018/05/word-image-4905.png" class="wp-image-5418" srcset="/wp-content/uploads/2018/05/word-image-4905.png 696w, /wp-content/uploads/2018/05/word-image-4905-300x60.png 300w" sizes="(max-width: 696px) 100vw, 696px" /></p>
<p>
  #情况2：表别名
</p>
<p><img loading="lazy" decoding="async" width="750" height="173" src="/wp-content/uploads/2018/05/word-image-4906.png" class="wp-image-5419" srcset="/wp-content/uploads/2018/05/word-image-4906.png 750w, /wp-content/uploads/2018/05/word-image-4906-300x69.png 300w" sizes="(max-width: 750px) 100vw, 750px" /></p>
<p>
  #情况3：derived  （from型子查询）
</p>
<p><img loading="lazy" decoding="async" width="637" height="171" src="/wp-content/uploads/2018/05/word-image-4907.png" class="wp-image-5420" srcset="/wp-content/uploads/2018/05/word-image-4907.png 637w, /wp-content/uploads/2018/05/word-image-4907-300x81.png 300w" sizes="(max-width: 637px) 100vw, 637px" /></p>
<p>
  #情况4：null
</p>
<p><img loading="lazy" decoding="async" width="625" height="161" src="/wp-content/uploads/2018/05/word-image-4908.png" class="wp-image-5421" srcset="/wp-content/uploads/2018/05/word-image-4908.png 625w, /wp-content/uploads/2018/05/word-image-4908-300x77.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<h3>4）分析，额外项（extra）</h3>
<p>
  index: 		   是指用到了索引覆盖,效率非常高
</p>
<p>
  using where      是指光靠索引定位不了,还得where判断一下
</p>
<p><strong>extra 中出现以下 2 项意味着 MYSQL 根本不能使用索引,效率会受到重大影响。应尽可能对此进行优化</strong>
</p>
<p>
  using temporary
</p>
<p>
  表示 MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。
</p>
<p>
  using filesort
</p>
<p>
  表示 MySQL 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。MySQL 中无法利用索引完成的排序操作称为“文件排序”
</p>
<h3>5）分析，连接所使用的类型（type）【重要的项分析】</h3>
<ul>
<li>
    这一列的常见值有：const、all、range、system、index
  </li>
</ul>
<p>
  最好的是  system ， 一般在表中只有一行记录的或者查询系统表的时候出现。
</p>
<p>
  其次就是 const，    一般在使用主键索引的时候会出现。
</p>
<p>
  其其次range，       一般在做范围查询的时候会使用 id &lt; 100。
</p>
<p>
  index，              代表可以使用索引做一些优化，一般在查询表的总行数的时候出现。
</p>
<p>
  all，                一般使用不上索引的时候出现。
</p>
<p>
  ref，				 意思是指 通过索引列,可以直接引用到某些数据行
</p>
<p>
  eq_ref，			 意思是指 通过索引列,可以直接引用某1行数据
</p>
<ul>
<li>
    场景
  </li>
</ul>
<p>
  #情况1：system
</p>
<p>
  #情况2：const
</p>
<p><img loading="lazy" decoding="async" width="802" height="152" src="/wp-content/uploads/2018/05/word-image-4909.png" class="wp-image-5422" srcset="/wp-content/uploads/2018/05/word-image-4909.png 802w, /wp-content/uploads/2018/05/word-image-4909-300x57.png 300w, /wp-content/uploads/2018/05/word-image-4909-768x146.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<p>
  #情况3：range
</p>
<p><img loading="lazy" decoding="async" width="812" height="391" src="/wp-content/uploads/2018/05/word-image-4910.png" class="wp-image-5423" srcset="/wp-content/uploads/2018/05/word-image-4910.png 812w, /wp-content/uploads/2018/05/word-image-4910-300x144.png 300w, /wp-content/uploads/2018/05/word-image-4910-768x370.png 768w" sizes="(max-width: 812px) 100vw, 812px" /></p>
<p>
  #情况4：all
</p>
<p><img loading="lazy" decoding="async" width="746" height="181" src="/wp-content/uploads/2018/05/word-image-4911.png" class="wp-image-5424" srcset="/wp-content/uploads/2018/05/word-image-4911.png 746w, /wp-content/uploads/2018/05/word-image-4911-300x73.png 300w" sizes="(max-width: 746px) 100vw, 746px" /></p>
<h2>4、索引的使用原则（哪些常见情况不能用索引?）</h2>
<h3>说明</h3>
<ul>
<li>
    like查询（“%”和“_”开头）索引失效   		  （sphinx网站中全站检索）
  </li>
<li>
    or运算都要具有索引否则索引失效
  </li>
<li>
    where条件字符串必须加引号
  </li>
<li>
    组合索引字段单独使用，左边生效，右边失效（左原则）
  </li>
</ul>
<h3>验证</h3>
<ul>
<li>
    like查询（“%”和“_”开头）索引失效   		  （sphinx网站中全站检索）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="758" height="455" src="/wp-content/uploads/2018/05/word-image-4912.png" class="wp-image-5425" srcset="/wp-content/uploads/2018/05/word-image-4912.png 758w, /wp-content/uploads/2018/05/word-image-4912-300x180.png 300w" sizes="(max-width: 758px) 100vw, 758px" /></p>
<ul>
<li>
    or运算都要具有索引否则索引失效
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1146" height="426" src="/wp-content/uploads/2018/05/word-image-4913.png" class="wp-image-5426" srcset="/wp-content/uploads/2018/05/word-image-4913.png 1146w, /wp-content/uploads/2018/05/word-image-4913-300x112.png 300w, /wp-content/uploads/2018/05/word-image-4913-768x285.png 768w, /wp-content/uploads/2018/05/word-image-4913-1024x381.png 1024w" sizes="(max-width: 1146px) 100vw, 1146px" /></p>
<ul>
<li>
    where条件字符串必须加引号
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="834" height="435" src="/wp-content/uploads/2018/05/word-image-4914.png" class="wp-image-5427" srcset="/wp-content/uploads/2018/05/word-image-4914.png 834w, /wp-content/uploads/2018/05/word-image-4914-300x156.png 300w, /wp-content/uploads/2018/05/word-image-4914-768x401.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></p>
<ul>
<li>
    组合索引字段单独使用，左边生效，右边失效（左原则）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="612" height="543" src="/wp-content/uploads/2018/05/word-image-4915.png" class="wp-image-5428" srcset="/wp-content/uploads/2018/05/word-image-4915.png 612w, /wp-content/uploads/2018/05/word-image-4915-300x266.png 300w" sizes="(max-width: 612px) 100vw, 612px" /><br />
<img loading="lazy" decoding="async" width="782" height="637" src="/wp-content/uploads/2018/05/word-image-4916.png" class="wp-image-5429" srcset="/wp-content/uploads/2018/05/word-image-4916.png 782w, /wp-content/uploads/2018/05/word-image-4916-300x244.png 300w, /wp-content/uploads/2018/05/word-image-4916-768x626.png 768w" sizes="(max-width: 782px) 100vw, 782px" /></p>
<h1>总结</h1>
<p>
  MySQL如何优化？
</p>
<p>
  架构：读写分离、主从复制
</p>
<p>
  设计：三范式、逆范式、存储引擎的选择、字段类型
</p>
<p>
  功能：索引、缓存、分区
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  什么是三范式：就是设计表的规则
</p>
<p>
  三范式好处：减少冗余，提高读写效率
</p>
<p>
  三范式有哪些：
</p>
<p>
  1）每个字段不可以拆分
</p>
<p>
  2）每个表必须有主键自增、每个表只描述一件事
</p>
<p>
  3）一个表不能包含其他表的非主键字段
</p>
<p>
  逆范式：反三范式规则、以空间换时间（冗余策略）
</p>
<p>
  多学一招：强烈推荐一个表有哪些基本字段（id、created_at、updated_at、display:1-显示,2-隐藏）
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
  存储引擎：myisam 、 innodb 、 archive 、 memory
</p>
<p>
  myisam和innodb区别
</p>
<p>
  存储结构：myisam三个文件，innodb一个文件
</p>
<p>
  锁：myisam表级锁，innodb可表可行级锁
</p>
<p>
  事物和外键支持：innodb都支持，myisam都不支持
</p>
<p>
  CURD操作：
</p>
<p>
  MyISAM：如果执行大量的SELECT，MyISAM是更好的选择。
</p>
<p>
  InnoDB：如果你的数据执行大量的INSERT或UPDATE，出于性能方面的考虑，应该使用InnoDB表。DELETE 从性能上InnoDB更优，但DELETE FROM table时，InnoDB不会重新建立表，而是一行一行的删除，在innodb上如果要清空保存有大量数据的表，最好使用truncate table这个命令。
</p>
<p>
  全文检索：MySQL5.6以下innodb不支持（都不支持中文）
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
  什么是索引：相当于书的目录，加快访问速度
</p>
<p>
  索引的好处：加快访问速度
</p>
<p>
  瑕疵：占用磁盘空间，影响读写速度，因为需要更新索引
</p>
<p>
  创建索引：alter table 表名 add  索引类型  索引名（字段名）;
</p>
<p>
  删除索引：drop index 索引名 on 表名
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  普通索引（index）      &#8211;  仅仅为了加快查询速度
</p>
<p>
  唯一索引（unique）     &#8211;  保证数据唯一性
</p>
<p>
  主键索引（primary key） &#8211;  既保证数据唯一不能为null
</p>
<p>
  全文检索（fulltext）    &#8211;  提取指定字段的关键字，添加索引
</p>
<p>
  组合索引		      &#8211;  同时给两个字段设置相同的索引
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  什么是MySQL中的执行计划：通过explain关键字分析SQL语句
</p>
<p>
  索引使用规则
</p>
<p>
  like查询（“%”和“_”开头）索引失效   		  （sphinx网站中全站检索）
</p>
<p>
  or运算都要具有索引否则索引失效
</p>
<p>
  where条件字符串必须加引号
</p>
<p>
  组合索引字段单独使用，左边生效，右边失效（左原则）</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5395.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
