<?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/%E7%B4%A2%E5%BC%95/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Tue, 29 Mar 2022 15:32:37 +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>
		<item>
		<title>网站优化（二）MySQL 优化 千万级数据、索引、存储过程</title>
		<link>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5385.html</link>
					<comments>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5385.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:48:20 +0000</pubDate>
				<category><![CDATA[优化方案]]></category>
		<category><![CDATA[网站优化]]></category>
		<category><![CDATA[千万级数据]]></category>
		<category><![CDATA[存储过程]]></category>
		<category><![CDATA[索引]]></category>
		<guid isPermaLink="false">/?p=5385</guid>

					<description><![CDATA[1、索引的作用 索引通俗来讲就相当于书的目录，当我们根据条件查询的时候，没有索引，便需要全表扫描，数据量少还可 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>1、索引的作用</h1>
<p>索引通俗来讲就相当于书的目录，当我们根据条件查询的时候，没有索引，便需要全表扫描，数据量少还可以，一旦数据量超过百万甚至千万，一条查询sql执行往往需要几十秒甚至更多，5秒以上就已经让人难以忍受了。</p>
<p>提升查询速度的方向一是提升硬件(内存、cpu、硬盘)，二是在软件上优化（加索引、优化sql；优化sql不在本文阐述范围之内）。能在软件上解决的，就不在硬件上解决，毕竟硬件提升代码昂贵，性价比太低。代价小且行之有效的解决方法就是合理的加索引。索引使用得当，能使查询速度提升上万倍，效果惊人。</p>
<h1>索 引类型</h1>
<p>MySQL的索引有5种</p>
<p>主键索引、普通索引、唯一索引、全文索引、组合索引（多列索引）</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>普通索引（index） &#8211; 仅仅只是为了提高查询的速度。</p>
<p>唯一索引（unique index） &#8211; 防止数据出现重复</p>
<p>主键索引（primary key） &#8211; 引保证数据的唯一性,而且不能为NULL</p>
<p>全文索引（fulltext key） &#8211; 从字段中提取的特别关键词</p>
<p>组合索引（多列索引） &#8211; 创建在多列上的索引</p>
<p>说明：唯一索引和全文索引用的很少，我们主要关注主键索引、普通索引和组合索引。</p>
<h1>索引的语法</h1>
<p>查看某张表的索引：show index from 表名；</p>
<p>创建普通索引：alter table 表名 add index 索引名 (加索引的列)</p>
<p>创建组合索引：alter table 表名 add index 索引名 (加索引的列1,加索引的列2)</p>
<p>删除某张表的索引：drop index 索引名 on 表名;</p>
<h1>性能测试</h1>
<h2>1）测试环境： 联想ThinkPad</h2>
<p><img loading="lazy" decoding="async" width="517" height="140" class="wp-image-5386" src="/wp-content/uploads/2018/05/word-image-4875.png" srcset="/wp-content/uploads/2018/05/word-image-4875.png 517w, /wp-content/uploads/2018/05/word-image-4875-300x81.png 300w" sizes="(max-width: 517px) 100vw, 517px" /></p>
<h2>2）创建数据表</h2>
<p>create database php0611 charset = utf8;</p>
<p>use php0611;</p>
<p><img loading="lazy" decoding="async" width="385" height="96" class="wp-image-5387" src="/wp-content/uploads/2018/05/word-image-4876.png" srcset="/wp-content/uploads/2018/05/word-image-4876.png 385w, /wp-content/uploads/2018/05/word-image-4876-300x75.png 300w" sizes="(max-width: 385px) 100vw, 385px" /></p>
<p>CREATE TABLE `test` (</p>
<p>`id` bigint(20) PRIMARY key not null AUTO_INCREMENT,</p>
<p>`username` varchar(11) DEFAULT NULL,</p>
<p>`gender` varchar(2) DEFAULT NULL,</p>
<p>`password` varchar(100) DEFAULT NULL</p>
<p>) ENGINE=MyISAM DEFAULT CHARSET=utf8;</p>
<p><img loading="lazy" decoding="async" width="531" height="143" class="wp-image-5388" src="/wp-content/uploads/2018/05/word-image-4877.png" srcset="/wp-content/uploads/2018/05/word-image-4877.png 531w, /wp-content/uploads/2018/05/word-image-4877-300x81.png 300w" sizes="(max-width: 531px) 100vw, 531px" /></p>
<h2>3）使用存储过程插入1千万条数据</h2>
<p>存储引擎使用MyISAM是因为此引擎没有事务，插入速度极快，方便我们快速插入千万条测试数据，等我们插完数据，再把存储类型修改为InnoDB。</p>
<p>delimiter $$</p>
<p>create procedure myproc()</p>
<p>begin</p>
<p>declare num int;</p>
<p>set num=1;</p>
<p>while num &lt;= 10000000 do</p>
<p>insert into test(username,gender,password) values(num,&#8217;保密&#8217;,PASSWORD(num));</p>
<p>set num=num+1;</p>
<p>end while;</p>
<p>end $$</p>
<p>delimiter ;</p>
<p># 说明：上述代码可优化insert检查循环次数 原理：values(),(),(); 更高效</p>
<p><img loading="lazy" decoding="async" width="702" height="263" class="wp-image-5389" src="/wp-content/uploads/2018/05/word-image-4878.png" srcset="/wp-content/uploads/2018/05/word-image-4878.png 702w, /wp-content/uploads/2018/05/word-image-4878-300x112.png 300w" sizes="(max-width: 702px) 100vw, 702px" /></p>
<p>由于使用的MyISAM引擎，插入1千万条数据，仅耗时246秒，若是InnoDB引擎，插入100万条数据就要花费数小时了。注：如需要使用innodb存储引擎，可通过命令：alter table test engine=InnoDB;此命令执行时间大约耗时5分钟，耐心等待。</p>
<h2>4）执行存储过程</h2>
<p>call myproc();</p>
<p><img loading="lazy" decoding="async" width="353" height="84" class="wp-image-5390" src="/wp-content/uploads/2018/05/word-image-4879.png" srcset="/wp-content/uploads/2018/05/word-image-4879.png 353w, /wp-content/uploads/2018/05/word-image-4879-300x71.png 300w" sizes="(max-width: 353px) 100vw, 353px" /></p>
<h2>5）测试结果1：没加索引</h2>
<p><img loading="lazy" decoding="async" width="666" height="302" class="wp-image-5391" src="/wp-content/uploads/2018/05/word-image-4880.png" srcset="/wp-content/uploads/2018/05/word-image-4880.png 666w, /wp-content/uploads/2018/05/word-image-4880-300x136.png 300w" sizes="(max-width: 666px) 100vw, 666px" /></p>
<h2>6）给username添加普通索引</h2>
<p><img loading="lazy" decoding="async" width="601" height="191" class="wp-image-5392" src="/wp-content/uploads/2018/05/word-image-4881.png" srcset="/wp-content/uploads/2018/05/word-image-4881.png 601w, /wp-content/uploads/2018/05/word-image-4881-300x95.png 300w" sizes="(max-width: 601px) 100vw, 601px" /></p>
<h2>7）测试结果2：加索引</h2>
<p><img loading="lazy" decoding="async" width="600" height="389" class="wp-image-5393" src="/wp-content/uploads/2018/05/word-image-4882.png" srcset="/wp-content/uploads/2018/05/word-image-4882.png 600w, /wp-content/uploads/2018/05/word-image-4882-300x195.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5385.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>网站优化（三）MySQL优化 并发、锁机制、索引、缓存、分表、分区算法、分区管理</title>
		<link>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5356.html</link>
					<comments>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5356.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:46:06 +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>
		<guid isPermaLink="false">/?p=5356</guid>

					<description><![CDATA[大型网站核心优化之MySQL优化 复习 什么是三范式： 就是设计数据库的规则 三范式好处：减少冗余，加快读写效 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>大型网站核心优化之MySQL优化</h1>
<h1>复习</h1>
<ul>
<li>
    什么是三范式： 就是设计数据库的规则
  </li>
<li>
    三范式好处：减少冗余，加快读写效率
  </li>
<li>
    三范式有哪些：
  </li>
</ul>
<ol>
<li>
  每个字段不可以再分
</li>
<li>
  一个表必须有主键、一个表只描述一件事
</li>
<li>
  一个表不能包含其他表的非主键字段（一个表只能包含其他表的主键）
</li>
</ol>
<ul>
<li>
    逆范式：以空间换时间
  </li>
</ul>
<p>
  MyIsam和InnoDB存储引擎区别
</p>
<ul>
<li>
    存储结构：myisam三个文件、innodb2个文件
  </li>
<li>
    事物和外键支持：myisam都不支持，innodb都支持
  </li>
<li>
    CURD操作：
  </li>
</ul>
<p>
  myisam读快
</p>
<p>
  innodb增、改快（注：如果需要删除整个表数据，直接用TRUNCATE语句删）
</p>
<ul>
<li>
    全文检索：mysql5.6+版本innodb和myisam都支持（都不支持中文）
  </li>
<li>
    锁：myisam支持表锁，innodb支持行和表锁
  </li>
</ul>
<p>
  字段类型选择：略（重要）
</p>
<p>
  #索引种类
</p>
<p>
  普通索引（index）				&#8211;  仅仅为加速
</p>
<p>
  唯一索引（unique）				&#8211;  保证唯一性
</p>
<p>
  主键索引（primary key）  		&#8211;  既保证唯一性又不能为null
</p>
<p>
  全文索引（fulltext）				&#8211;  提取指定字段的内容增加索引
</p>
<p>
  组合索引							&#8211;  给两个字段同时设置索引
</p>
<p>
  #建表创建索引
</p>
<p>
  create table 表名(
</p>
<p>
  index（字段名）,
</p>
<p>
  unique（字段名），
</p>
<p>
  primary key （字段名），
</p>
<p>
  fulltext （字段名），
</p>
<p>
  index（字段名1，字段名2）
</p>
<p>
  );
</p>
<p>
  #修改表创建索引
</p>
<p>
  创建索引：alter table 表名 add 索引类型 索引名（字段名）
</p>
<p>
  删除索引：drop index 索引名 on 表名
</p>
<p>
  慢查询日志作用：记录慢SQL语句
</p>
<p>
  如何开启：
</p>
<p>
  show variables like &#8216;slow_query%&#8217;;
</p>
<p>
  show variables like &#8216;%query_time&#8217;;
</p>
<p>
  如何分析慢SQL语句：explain 待分析的SQL语句 \G
</p>
<h1>︴场景：并发</h1>
<h2>1、概念</h2>
<p>
  场景：在实际工作中会出现负库存
</p>
<p>
  原因：并发
</p>
<p>
  并发：好比同时有n多人超市结账
</p>
<h2>负库存案例代码</h2>
<h3>1）SQL语句</h3>
<p>
  create database shop;
</p>
<p>
  use shop;
</p>
<p>
  &#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  &#8212; Table structure for `goods`
</p>
<p>
  &#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  DROP TABLE IF EXISTS `goods`;
</p>
<p>
  CREATE TABLE `goods` (
</p>
<p>
    `id` int(11) NOT NULL AUTO_INCREMENT,
</p>
<p>
    `num` int(11) NOT NULL DEFAULT &#8216;0&#8217;,
</p>
<p>
    PRIMARY KEY (`id`)
</p>
<p>
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
</p>
<p>
  &#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  &#8212; Records of goods
</p>
<p>
  &#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  INSERT INTO `goods` VALUES (&#8216;1&#8217;, &#8216;100&#8217;);
</p>
<h3>2）代码</h3>
<p>
  // 语法：ab -n 1000 -c 100 http://localhost/test/test.php
</p>
<p>
  // 说明：n &#8211; 请求总数 ,  c  &#8211; 并且
</p>
<p>
  //http://localhost/test/test.php
</p>
<p>
  $conn = @mysql_connect(&#8216;127.0.0.1&#8242;,&#8217;root&#8217;,&#8217;root&#8217;);
</p>
<p>
  mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
  mysql_query(&#8216;use shop&#8217;);
</p>
<p>
  // $fp = fopen(&#8216;lock.txt&#8217;, &#8216;w&#8217;);
</p>
<p>
  // flock($fp, LOCK_EX);
</p>
<p>
  mysql_query(&#8216;lock table goods write;&#8217;);
</p>
<p>
  $sql = &#8220;select num from goods where id = 1&#8221;;
</p>
<p>
  $res = mysql_query($sql);
</p>
<p>
  $tmp = mysql_fetch_assoc($res);
</p>
<p>
  $num = $tmp[&#8216;num&#8217;];
</p>
<p>
  if ($num) {
</p>
<p>
  //减库存
</p>
<p>
  $sql=&#8221;update goods set num=num-1 where id = 1&#8243;;
</p>
<p>
  mysql_query($sql);
</p>
<p>
  }
</p>
<p>
  // flock($fp, LOCK_UN);
</p>
<p>
  mysql_query(&#8216;unlock table;&#8217;);
</p>
<p>
  echo &#8216;ok&#8217;;
</p>
<p>
  die;
</p>
<h2>解决</h2>
<h3>MySQL锁（强烈不推荐）</h3>
<p><img loading="lazy" decoding="async" width="750" height="653" src="/wp-content/uploads/2018/05/word-image-4848.png" class="wp-image-5357" srcset="/wp-content/uploads/2018/05/word-image-4848.png 750w, /wp-content/uploads/2018/05/word-image-4848-300x261.png 300w" sizes="(max-width: 750px) 100vw, 750px" /></p>
<p>
  &lt;?php
</p>
<p>
  // 语法：ab -n 1000 -c 100 http://localhost/test/test.php
</p>
<p>
  // 说明：n &#8211; 请求总数 ,  c  &#8211; 并且
</p>
<p>
  //http://localhost/test/test.php
</p>
<p>
  $conn = @mysql_connect(&#8216;127.0.0.1&#8242;,&#8217;root&#8217;,&#8217;root&#8217;);
</p>
<p>
  mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
  mysql_query(&#8216;use shop&#8217;);
</p>
<p>
  // mysql_query(&#8216;lock table goods write&#8217;);//开启排它锁
</p>
<p>
  $sql = &#8220;select num from goods where id = 1&#8221;;
</p>
<p>
  $res = mysql_query($sql);
</p>
<p>
  $tmp = mysql_fetch_assoc($res);
</p>
<p>
  $num = $tmp[&#8216;num&#8217;];
</p>
<p>
  if ($num) {
</p>
<p>
  	//减库存
</p>
<p>
  	$sql=&#8221;update goods set num=num-1 where id = 1&#8243;;
</p>
<p>
  	mysql_query($sql);
</p>
<p>
  	// mysql_query(&#8216;unlock table&#8217;);//释放锁
</p>
<p>
  }
</p>
<p>
  echo &#8216;ok&#8217;;
</p>
<p>
  die;
</p>
<h3>2）文件锁（不推荐）</h3>
<p><img loading="lazy" decoding="async" width="779" height="659" src="/wp-content/uploads/2018/05/word-image-4849.png" class="wp-image-5358" srcset="/wp-content/uploads/2018/05/word-image-4849.png 779w, /wp-content/uploads/2018/05/word-image-4849-300x254.png 300w, /wp-content/uploads/2018/05/word-image-4849-768x650.png 768w" sizes="(max-width: 779px) 100vw, 779px" /></p>
<p>
  &lt;?php
</p>
<p>
  // 语法：ab -n 1000 -c 100 http://localhost/test/test.php
</p>
<p>
  // 说明：n &#8211; 请求总数 ,  c  &#8211; 并且
</p>
<p>
  //http://localhost/test/test.php
</p>
<p>
  $conn = @mysql_connect(&#8216;127.0.0.1&#8242;,&#8217;root&#8217;,&#8217;root&#8217;);
</p>
<p>
  mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
  mysql_query(&#8216;use shop&#8217;);
</p>
<p>
  // mysql_query(&#8216;lock table goods write&#8217;);//开启排它锁
</p>
<p>
  $fp = fopen(&#8216;lock.txt&#8217;, &#8216;a+&#8217;);
</p>
<p>
  flock($fp, LOCK_EX);
</p>
<p>
  $sql = &#8220;select num from goods where id = 1&#8221;;
</p>
<p>
  $res = mysql_query($sql);
</p>
<p>
  $tmp = mysql_fetch_assoc($res);
</p>
<p>
  $num = $tmp[&#8216;num&#8217;];
</p>
<p>
  if ($num) {
</p>
<p>
  	//减库存
</p>
<p>
  	$sql=&#8221;update goods set num=num-1 where id = 1&#8243;;
</p>
<p>
  	$rs = mysql_query($sql);
</p>
<p>
  	// mysql_query(&#8216;unlock table&#8217;);//释放锁
</p>
<p>
  	flock(LOCK_UN);
</p>
<p>
  }
</p>
<p>
  echo &#8216;ok&#8217;;
</p>
<p>
  die;
</p>
<h3>3）消息队列（推荐）</h3>
<h1>︴扩展：MySQL中锁机制【★★★】</h1>
<h2>概念</h2>
<p>
  在MySQL数据库中MyISAM存储引擎采用的是表级锁，InnoDB存储引擎采用的是行级锁、也支表行级锁。（ps. 锁分两种模式，分别为：共享锁和排他锁）
</p>
<p>
  共享读锁/共享锁（lock table 表名read;）    其他用户：读-可以，写-堵塞
</p>
<p>
  独占写锁/排他锁（lock table 表名 write;）   其他用户：读-堵塞，写-堵塞
</p>
<p>
  释放锁：unlock table
</p>
<h2>2、练习</h2>
<h3>1）表锁的演示</h3>
<ul>
<li>
    MyISAM表锁
  </li>
</ul>
<p>
  create table lock_t1 (
</p>
<p>
  id int primary key auto_increment,
</p>
<p>
  name varchar(30) not null
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  #session1，开启共享锁
</p>
<p>
  lock table lock_t1 read;
</p>
<p>
  #session1，读（可以）
</p>
<p>
  #session1，写（不可以，报错）
</p>
<p>
  #session2，读（可以）
</p>
<p>
  #session2，写（堵塞）
</p>
<p>
  unlock table;
</p>
<p>
  #session1，开启排他锁
</p>
<p>
  lock table lock_t1 write;
</p>
<p>
  #session1，读（可以）
</p>
<p>
  #session1，写（可以）
</p>
<p>
  #session2，读（堵塞）
</p>
<p>
  #session2，写（堵塞）
</p>
<p>
  unlock table;
</p>
<ul>
<li>
    InnoDB表锁
  </li>
</ul>
<p>
  create table lock_t2 (
</p>
<p>
  id int primary key auto_increment,
</p>
<p>
  name varchar(30) not null
</p>
<p>
  )engine=innodb charset=utf8;
</p>
<p>
  #session1，开启共享锁
</p>
<p>
  lock table lock_t2 read;
</p>
<p>
  #session1，读（可以）
</p>
<p>
  #session1，写（不可以，报错）
</p>
<p>
  #session2，读（可以）
</p>
<p>
  #session2，写（堵塞）
</p>
<p>
  unlock table;
</p>
<p>
  #session1，开启排他锁
</p>
<p>
  lock table lock_t2 write;
</p>
<p>
  #session1，读（可以）
</p>
<p>
  #session1，写（可以）
</p>
<p>
  #session2，读（堵塞）
</p>
<p>
  #session2，写（堵塞）
</p>
<p>
  unlock table;
</p>
<ul>
<li>
    验证：MyISAM存储引擎默认是表级锁
  </li>
</ul>
<p>
  上一讲我们插入了1千万数据不适用主键索引查询需要3~4min，问A窗口查询过程中B窗口修改等待还是直接执行？
</p>
<p>
  分析：因为myisam是表锁，所以写堵塞
</p>
<p>
  回答：堵塞
</p>
<h3>2）行锁的演示</h3>
<p>
  create table t2 (
</p>
<p>
  id int primary key auto_increment,
</p>
<p>
  name varchar(30) not null
</p>
<p>
  )engine=innodb charset=utf8;
</p>
<p>
  insert into t2 value (null, &#8216;aaa&#8217;);
</p>
<p>
  insert into t2 value (null, &#8216;aaa&#8217;);
</p>
<p>
  begin;
</p>
<p>
  update t2 set name = &#8216;bb&#8217; where id = 1;
</p>
<p>
  update t2 set name = &#8216;ccc&#8217; where id = 1;
</p>
<h2><a id="post-5356-_Toc435371841"></a>3、锁的特点</h2>
<ul>
<li>
    表级锁代表（MyISAM）：开销小，加锁快；不会出现死锁；锁定粒度大，发生锁
  </li>
</ul>
<p>
  冲突的概率最高，并发度最低（堵塞频率高）。
</p>
<p>
  开销小：相对行级锁加锁资源较少
</p>
<p>
  锁定颗粒度大：指锁的级别，最小的行级锁，最大的表锁
</p>
<p>
  锁冲突高：因为针对整个表加锁，除非没有其他人操作否则冲突概率大
</p>
<ul>
<li>
    行级锁（InnoDB）：开销大，加锁慢；会出现死锁；锁定粒度最小，发生锁冲突概
  </li>
</ul>
<p>
  率最低，并发度也最高（堵塞频率低）。
</p>
<p>
  死锁：指开启事物不提交导致
</p>
<h1>︴扩展：PHP中的文件锁机制【★★★】</h1>
<h2>1、说明</h2>
<p>
  文件锁机制一般在单独操作文件时看不到效果，需要多人同时操作（并发）
</p>
<h2>2、文件锁的用途（举例）</h2>
<p>
  若一个人在写入一个文件，另外一个人同时也打个了这个文件进行写入文件。
</p>
<p>
  这情况下，很难明确谁的操作为准。因此，这个时候我们引入锁机制。若用户A在写入或者读取这个文件的时候，将文件加上共享锁。我可以读，其他人也可以读。但是，其他人不可以写。我使用独占锁/排它锁。这个文件归我了，你们都别动，除非我将文件锁进行释放。
</p>
<p>
  A共享锁    B：读-可以，写-不行（堵塞）
</p>
<p>
  A排它锁    B：读-不行（堵塞），写-不行（堵塞）
</p>
<h2>语法</h2>
<ul>
<li>
    语法：flock（资源，锁类型）
  </li>
<li>
    锁类型
  </li>
</ul>
<p>
  LOCK_SH    	取得共享锁定（读取的程序）
</p>
<p>
  LOCK_EX		取得独占锁/排它锁定（写入的程序）
</p>
<p>
  LOCK_UN    	释放锁定（无论共享或独占）
</p>
<p>
  LOCK_NB		当被锁定时，不阻塞，而是提示锁定。
</p>
<p>
  r   读  ，指针文件头
</p>
<p>
  r+  读写，指针文件头（文件必须先存在）
</p>
<p>
  w   写  ，清空数据，文件不存在自动创建
</p>
<p>
  w+  读写，清空数据，文件不存在自动创建
</p>
<p>
  a   写  ，追加数据，文件不存在自动创建
</p>
<p>
  a+  读写，追加数据，文件不存在自动创建
</p>
<p>
  脚下留心：加锁必须释放
</p>
<p>
  浏览器机制：当前用户同一浏览器请求同一个文件，堵塞，所以使用两个文件测试
</p>
<ul>
<li>
    案例
  </li>
</ul>
<p>
  a.php
</p>
<p>
  &lt;?php
</p>
<p>
  header(&#8216;content-type:text/html;charset=utf-8&#8217;);
</p>
<p>
  /**
</p>
<p>
  r  只读，并且光标行首
</p>
<p>
  r+ 读写（注：文件必须存在）
</p>
<p>
  w  写  （清空数据，文件不存在自动创建）
</p>
<p>
  w+ 读写（清空数据，文件不存在自动创建）
</p>
<p>
  a  写  （追加数据，文件不存在自动创建）
</p>
<p>
  a+ 读写（追加数据，文件不存在自动创建）
</p>
<p>
  */
</p>
<p>
  $fp = fopen(&#8216;./a.txt&#8217;, &#8216;a+&#8217;);
</p>
<p>
  /**
</p>
<p>
  LOCK_SH 获取读锁（共享锁）
</p>
<p>
  LOCK_EX 获取写锁（排他锁）
</p>
<p>
  LOCK_UN 释放锁
</p>
<p>
  LOCK_NB 当被锁定时，不阻塞，而是提示锁定。
</p>
<p>
  */
</p>
<p>
  if (flock($fp, LOCK_EX)) {
</p>
<p>
  	echo fread($fp, 20);
</p>
<p>
  	sleep(15);
</p>
<p>
  	echo fread($fp, 20);
</p>
<p>
  	flock($fp, LOCK_UN);
</p>
<p>
  }
</p>
<p>
  b.php
</p>
<p>
  &lt;?php
</p>
<p>
  $fp = fopen(&#8216;./a.txt&#8217;, &#8216;a+&#8217;);
</p>
<p>
  /**
</p>
<p>
  LOCK_SH 获取读锁（共享锁）
</p>
<p>
  LOCK_EX 获取写锁（排他锁）
</p>
<p>
  LOCK_UN 释放所
</p>
<p>
  LOCK_NB 当被锁定时，不阻塞，而是提示锁定。
</p>
<p>
  */
</p>
<p>
  if (flock($fp, LOCK_EX | LOCK_NB)) {
</p>
<p>
  	echo 11;die;
</p>
<p>
  	// echo fread($fp, 20);
</p>
<p>
  	$rs = fwrite($fp, 9);
</p>
<p>
  	var_dump($rs);
</p>
<p>
  	flock($fp, LOCK_UN);
</p>
<p>
  }
</p>
<h2>应用场景</h2>
<p>
  秒杀项目，不推荐   -&gt;  可用 php + redis 消息队列代替
</p>
<p>
  第三方支付通知文件锁案例
</p>
<h1>一、前缀索引</h1>
<h2>1、什么是前缀索引</h2>
<h3>1）概念</h3>
<p>
  前缀索引：指一个字段的内容，只需前面n个字符就可以具备唯一标识，将其创建为索引，最终形成“前缀索引”。
</p>
<p>
  前缀索引好处：索引很长的字符列，它会使索引变大而且变慢，前缀索引能很好地减少索引的大小及提高速度。
</p>
<h3>举例</h3>
<p>
  name
</p>
<p>
  啊增
</p>
<p>
  小泽
</p>
<p>
  玛丽
</p>
<p>
  苍苍
</p>
<p>
  姚姚
</p>
<p>
  发现：以前需要把整个name字段看完，才能找到数据，现在因为姓名第一个字符【啊、小&#8230;】具备唯一性所以我们只要第一个字符就可以快速查找。
</p>
<h2>2、制作前缀索引</h2>
<h3>1）创建数据</h3>
<p>
  create table qianzhui (
</p>
<p>
  id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  name varchar(30) not null comment &#8216;姓名&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  insert into qianzhui values (null, &#8216;张三&#8217;);
</p>
<p>
  insert into qianzhui values (null, &#8216;王八三&#8217;);
</p>
<p>
  insert into qianzhui values (null, &#8216;小三&#8217;);
</p>
<p>
  insert into qianzhui values (null, &#8216;大三&#8217;);
</p>
<h3>2）创建前缀索引</h3>
<p>
  语法：alter table 表名 add  index 索引名(字段名(字符个数))
</p>
<p>
  alter table qianzhui add index qianzhui(name(1));
</p>
<p><img loading="lazy" decoding="async" width="579" height="374" src="/wp-content/uploads/2018/05/word-image-4850.png" class="wp-image-5359" srcset="/wp-content/uploads/2018/05/word-image-4850.png 579w, /wp-content/uploads/2018/05/word-image-4850-300x194.png 300w" sizes="(max-width: 579px) 100vw, 579px" /></p>
<h3>3）验证</h3>
<p><img loading="lazy" decoding="async" width="899" height="527" src="/wp-content/uploads/2018/05/word-image-4851.png" class="wp-image-5360" srcset="/wp-content/uploads/2018/05/word-image-4851.png 899w, /wp-content/uploads/2018/05/word-image-4851-300x176.png 300w, /wp-content/uploads/2018/05/word-image-4851-768x450.png 768w" sizes="(max-width: 899px) 100vw, 899px" /></p>
<h1>二、全文索引（了解）</h1>
<h2>1、什么是全文索引</h2>
<p>
  试想在1M大小的文件中搜索一个词，可能需要几秒，在100M的文件中可能需要几十秒，如果在更大的文件中搜索那么就需要更大的系统开销，这样的开销是不现实的。
</p>
<p>
  全文索引：提取指定字段里面的内容添加索引
</p>
<p>
  目的：加速like语句查询速度（注：mysql全文索引不支持中文）  sphinx
</p>
<p><img loading="lazy" decoding="async" width="820" height="105" src="/wp-content/uploads/2018/05/word-image-4852.png" class="wp-image-5361" srcset="/wp-content/uploads/2018/05/word-image-4852.png 820w, /wp-content/uploads/2018/05/word-image-4852-300x38.png 300w, /wp-content/uploads/2018/05/word-image-4852-768x98.png 768w" sizes="(max-width: 820px) 100vw, 820px" /></p>
<h2>2、具体操作</h2>
<h3>1）创建测试数据</h3>
<p>
  #创建文章表
</p>
<p>
  create table articles2 (
</p>
<p>
  id int unsigned primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  title varchar(80) not null comment &#8216;标题&#8217;,
</p>
<p>
  content text not null comment &#8216;内容&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  #插入文章数据（禁中文，不支持）
</p>
<p>
  insert into articles2
</p>
<p>
  (title,content)
</p>
<p>
  value
</p>
<p>
  (&#8216;MySQL Tutorial&#8217;,&#8217;DBMS stands for DataBase &#8230;&#8217;),
</p>
<p>
  (&#8216;How To Use MySQL Well&#8217;,&#8217;After you went through a &#8230;&#8217;),
</p>
<p>
  (&#8216;Optimizing MySQL&#8217;,&#8217;In this tutorial we will show &#8230;&#8217;),
</p>
<p>
  (&#8216;1001 MySQL Tricks&#8217;,&#8217;1. Never run mysqld as root. 2. &#8230;&#8217;),
</p>
<p>
  (&#8216;MySQL vs. YourSQL&#8217;,&#8217;In the following database comparison &#8230;&#8217;),
</p>
<p>
  (&#8216;MySQL Security&#8217;,&#8217;When configured properly, MySQL &#8230;&#8217;);
</p>
<h3>添加全文所引</h3>
<p>
  alter table articles2 add fulltext title(title);
</p>
<h3>使用全文索引</h3>
<ul>
<li>
    语法：select * from 表名where match(字段) against(‘内容’ IN BOOLEAN MODE);
  </li>
<li>
    参数：
  </li>
<li>
    如果添加全文索引是多个字段，如：fulltext（title，content）则查询语句字段处格
  </li>
</ul>
<p>
  式：match（字段1，字段2）
</p>
<ul>
<li>
    如果需要检索多个关键字，则内容处：‘内容1,内容2’
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="850" height="551" src="/wp-content/uploads/2018/05/word-image-4853.png" class="wp-image-5362" srcset="/wp-content/uploads/2018/05/word-image-4853.png 850w, /wp-content/uploads/2018/05/word-image-4853-300x194.png 300w, /wp-content/uploads/2018/05/word-image-4853-768x498.png 768w" sizes="(max-width: 850px) 100vw, 850px" /></p>
<h1>三、limit分页优化（百万至千万级快速分页）</h1>
<h2>1、概念</h2>
<p>
  当数据单表数据超过一定量后分页查询特别慢
</p>
<h2>分析</h2>
<p><img loading="lazy" decoding="async" width="816" height="421" src="/wp-content/uploads/2018/05/word-image-4854.png" class="wp-image-5363" srcset="/wp-content/uploads/2018/05/word-image-4854.png 816w, /wp-content/uploads/2018/05/word-image-4854-300x155.png 300w, /wp-content/uploads/2018/05/word-image-4854-768x396.png 768w" sizes="(max-width: 816px) 100vw, 816px" /></p>
<h2>思路</h2>
<p>
  1、从业务角度优化（百度、谷歌分页限制）
</p>
<p>
  2、使用索引查询（where 条件 limit 数字）       索引+缓存（策略：功能+分页作为缓存唯一标识）
</p>
<ol>
<li>
  索引使用
</li>
</ol>
<p><img loading="lazy" decoding="async" width="863" height="546" src="/wp-content/uploads/2018/05/word-image-4855.png" class="wp-image-5364" srcset="/wp-content/uploads/2018/05/word-image-4855.png 863w, /wp-content/uploads/2018/05/word-image-4855-300x190.png 300w, /wp-content/uploads/2018/05/word-image-4855-768x486.png 768w" sizes="(max-width: 863px) 100vw, 863px" /><br />
<img loading="lazy" decoding="async" width="1283" height="443" src="/wp-content/uploads/2018/05/word-image-4856.png" class="wp-image-5365" srcset="/wp-content/uploads/2018/05/word-image-4856.png 1283w, /wp-content/uploads/2018/05/word-image-4856-300x104.png 300w, /wp-content/uploads/2018/05/word-image-4856-768x265.png 768w, /wp-content/uploads/2018/05/word-image-4856-1024x354.png 1024w" sizes="(max-width: 1283px) 100vw, 1283px" /></p>
<p>
  发现：where通过主键赛选非常快，但是增加多个条件又慢了
</p>
<p><img loading="lazy" decoding="async" width="651" height="109" src="/wp-content/uploads/2018/05/word-image-4857.png" class="wp-image-5366" srcset="/wp-content/uploads/2018/05/word-image-4857.png 651w, /wp-content/uploads/2018/05/word-image-4857-300x50.png 300w" sizes="(max-width: 651px) 100vw, 651px" /></p>
<p>
  解决：添加组合索引
</p>
<p><img loading="lazy" decoding="async" width="877" height="654" src="/wp-content/uploads/2018/05/word-image-4858.png" class="wp-image-5367" srcset="/wp-content/uploads/2018/05/word-image-4858.png 877w, /wp-content/uploads/2018/05/word-image-4858-300x224.png 300w, /wp-content/uploads/2018/05/word-image-4858-768x573.png 768w" sizes="(max-width: 877px) 100vw, 877px" /></p>
<h1>五、查询缓存（了解）</h1>
<h2>1、概念</h2>
<p>
  MySQL第一次执行后保存缓存数据，第二次直接从缓存中读取。
</p>
<h2>相关SQL语句</h2>
<p>
  查看SQL缓存参数：show variables like &#8216;query_cache%&#8217;;
</p>
<p>
  开启SQL缓存：set global query_cache_type = 1
</p>
<p>
  关闭SQL缓存：set global query_cache_type = 0
</p>
<p>
  设置缓存空间：set global query_cache_size = 1024*1024*64  #单位/M
</p>
<p>
  固定SQL语句声明不适用缓存：select sql_no_cache * from 表名
</p>
<h2>开启缓存</h2>
<p>
  步骤1：测试数据库
</p>
<p><img loading="lazy" decoding="async" width="465" height="149" src="/wp-content/uploads/2018/05/word-image-4859.png" class="wp-image-5368" srcset="/wp-content/uploads/2018/05/word-image-4859.png 465w, /wp-content/uploads/2018/05/word-image-4859-300x96.png 300w" sizes="(max-width: 465px) 100vw, 465px" /></p>
<p>
  步骤2：开启缓存
</p>
<p>
  set global query_cache_type = 1;
</p>
<p><img loading="lazy" decoding="async" width="425" height="450" src="/wp-content/uploads/2018/05/word-image-4860.png" class="wp-image-5369" srcset="/wp-content/uploads/2018/05/word-image-4860.png 425w, /wp-content/uploads/2018/05/word-image-4860-283x300.png 283w" sizes="(max-width: 425px) 100vw, 425px" /></p>
<p>
  步骤3：设置缓存空间
</p>
<p><img loading="lazy" decoding="async" width="480" height="300" src="/wp-content/uploads/2018/05/word-image-4861.png" class="wp-image-5370" srcset="/wp-content/uploads/2018/05/word-image-4861.png 480w, /wp-content/uploads/2018/05/word-image-4861-300x188.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></p>
<p>
  步骤4：测试
</p>
<p><img loading="lazy" decoding="async" width="513" height="313" src="/wp-content/uploads/2018/05/word-image-4862.png" class="wp-image-5371" srcset="/wp-content/uploads/2018/05/word-image-4862.png 513w, /wp-content/uploads/2018/05/word-image-4862-300x183.png 300w" sizes="(max-width: 513px) 100vw, 513px" /></p>
<h2>4、不使用缓存</h2>
<p><img loading="lazy" decoding="async" width="634" height="392" src="/wp-content/uploads/2018/05/word-image-4863.png" class="wp-image-5372" srcset="/wp-content/uploads/2018/05/word-image-4863.png 634w, /wp-content/uploads/2018/05/word-image-4863-300x185.png 300w" sizes="(max-width: 634px) 100vw, 634px" /></p>
<h2>说明</h2>
<p>
  发现：该功能了解即可，这是从MySQL层面缓存不推荐使用，因为及时缓存了PHP操作MySQL还是有额外开销
</p>
<p>
  解决：后期通过php直接操作内存缓存（内存缓存  &gt; 文件缓存  &gt;  数据库）
</p>
<p><img loading="lazy" decoding="async" width="832" height="706" src="/wp-content/uploads/2018/05/word-image-4864.png" class="wp-image-5373" srcset="/wp-content/uploads/2018/05/word-image-4864.png 832w, /wp-content/uploads/2018/05/word-image-4864-300x255.png 300w, /wp-content/uploads/2018/05/word-image-4864-768x652.png 768w" sizes="(max-width: 832px) 100vw, 832px" /></p>
<h1>六、分表技术（重点）</h1>
<h2>1、水平分表</h2>
<h3>1）说明</h3>
<p>
  当一个表很大时我们创建索引后，查询速度还是很慢, 把一个巨大的表安装某个
</p>
<p>
  标准分割成小表，这样可以提供查询的速度.
</p>
<p><img loading="lazy" decoding="async" width="551" height="384" src="/wp-content/uploads/2018/05/word-image-4865.png" class="wp-image-5374" srcset="/wp-content/uploads/2018/05/word-image-4865.png 551w, /wp-content/uploads/2018/05/word-image-4865-300x209.png 300w" sizes="(max-width: 551px) 100vw, 551px" /></p>
<h3>2）原理</h3>
<p><img loading="lazy" decoding="async" width="1128" height="534" src="/wp-content/uploads/2018/05/word-image-4866.png" class="wp-image-5375" srcset="/wp-content/uploads/2018/05/word-image-4866.png 1128w, /wp-content/uploads/2018/05/word-image-4866-300x142.png 300w, /wp-content/uploads/2018/05/word-image-4866-768x364.png 768w, /wp-content/uploads/2018/05/word-image-4866-1024x485.png 1024w" sizes="(max-width: 1128px) 100vw, 1128px" /></p>
<h2>2、垂直分表</h2>
<ul>
<li>
    目的：减少字段长度，加快查询速度。
  </li>
<li>
    表中存在多个字段：常用字段和非常用字段
  </li>
<li>
    例如：学生表可以分成，分为基础表和额外表，两张表中记录为1:1的关系。
  </li>
</ul>
<p>
  原表
</p>
<p>
  id   name  pwd   age    sex   籍贯    政治面貌   &#8230;&#8230;
</p>
<p>
  垂直分割表
</p>
<p>
  基础信息表（student_base）
</p>
<p>
  id	 	name	 age  pwd
</p>
<p>
  额外信息表（student_extra）
</p>
<p>
  id		籍贯	政治面貌
</p>
<h2><a id="post-5356-_Toc448765224"></a>3、为什么需要MySQL分表/分区</h2>
<p>
  假设一个数据表中存储1亿条记录，我们检索数据就必须检索1亿条记录，但
</p>
<p>
  是这样是非常耗时的，因为MySQL本质还是以文件形式存储的，所以其读取
</p>
<p>
  都要涉及到服务器的I/O开销，这就是MySQL的性能瓶颈。遇到这种情况，我
</p>
<p>
  们就可以使用分表程序，把1亿条记录的数据表分割成10份：每一份只需要存
</p>
<p>
  储1000万条数据，这样其数据的检索也会变得更加高效！
</p>
<h2>分区算法</h2>
<h3>1）MySQL四种分区算法介绍</h3>
<ul>
<li>
    求余（主键字段）：
  </li>
<li>
    key  利用某个字段的值，进行求余，完成分区
  </li>
<li>
    hash 利用某个整型表达式的值，完成分区
  </li>
<li>
    条件：
  </li>
<li>
    list   值在指定列表内的分区
  </li>
<li>
    range 值在某个范围内的分区
  </li>
</ul>
<h3>2）分区语法</h3>
<p>
  说明：在创建表都得时候进行分区，后期也可以增加和删除分区
</p>
<p>
  语法：
</p>
<p>
  create table 表名(
</p>
<p>
  )engine=存储引擎 charset=编号
</p>
<p>
  partition by 分区算法（字段） 分区选项；
</p>
<h3>key分区</h3>
<p>
  #创建数据库p1
</p>
<p>
  create database p1;
</p>
<p>
  #选择数据库
</p>
<p>
  use p1;
</p>
<p>
  #创建表
</p>
<p>
  create table articles(
</p>
<p>
    id int unsigned primary key auto_increment,
</p>
<p>
    title varchar(50) not null,
</p>
<p>
    content text
</p>
<p>
  ) engine = myisam charset = utf8
</p>
<p>
  partition by key(id) partitions <strong>10</strong>;
</p>
<p>
  #根据key算法，创建10个分区（注：就相当于创建了10个表）
</p>
<p>
  insert into articles values (null,&#8217;aaa&#8217;,&#8217;bb&#8217;);
</p>
<p>
  flush table articles;
</p>
<p><img loading="lazy" decoding="async" width="1079" height="522" src="/wp-content/uploads/2018/05/word-image-4867.png" class="wp-image-5376" srcset="/wp-content/uploads/2018/05/word-image-4867.png 1079w, /wp-content/uploads/2018/05/word-image-4867-300x145.png 300w, /wp-content/uploads/2018/05/word-image-4867-768x372.png 768w, /wp-content/uploads/2018/05/word-image-4867-1024x495.png 1024w" sizes="(max-width: 1079px) 100vw, 1079px" /></p>
<p>
  多学一招：flush table 表名; 刷新表清除缓存
</p>
<h3>4）hash 分区</h3>
<p>
  #创建数据库p2
</p>
<p>
  create database p2;
</p>
<p>
  #选择数据库
</p>
<p>
  use p2;
</p>
<p>
  #创建表
</p>
<p>
  create table articles(
</p>
<p>
    id int unsigned primary key auto_increment,
</p>
<p>
    title varchar(50) not null,
</p>
<p>
    content text
</p>
<p>
  ) engine = myisam charset = utf8
</p>
<p>
  partition by hash (id) partitions <strong>4</strong>;
</p>
<p>
  insert into articles values (null,&#8217;aaa&#8217;,&#8217;bb&#8217;);
</p>
<p>
  flush table articles;
</p>
<p><img loading="lazy" decoding="async" width="1072" height="479" src="/wp-content/uploads/2018/05/word-image-4868.png" class="wp-image-5377" srcset="/wp-content/uploads/2018/05/word-image-4868.png 1072w, /wp-content/uploads/2018/05/word-image-4868-300x134.png 300w, /wp-content/uploads/2018/05/word-image-4868-768x343.png 768w, /wp-content/uploads/2018/05/word-image-4868-1024x458.png 1024w" sizes="(max-width: 1072px) 100vw, 1072px" /></p>
<h3>5）list分区</h3>
<p>
  #创建数据库p3
</p>
<p>
  create database p3;
</p>
<p>
  #选择数据库
</p>
<p>
  use p3;
</p>
<p>
  #创建表
</p>
<p>
  create table articles(
</p>
<p>
    id int unsigned auto_increment,
</p>
<p>
    title varchar(50) not null,
</p>
<p>
    content text,
</p>
<p>
    cid int unsigned,
</p>
<p>
  primary key (id,cid)
</p>
<p>
  ) engine = myisam charset = utf8
</p>
<p>
  partition by list(cid) (
</p>
<p>
  partition c1 values in (1,3),
</p>
<p>
  partition c2 values in (2,4),
</p>
<p>
  partition c3 values in (5,6,7)
</p>
<p>
  );
</p>
<p>
  #创建3个分区，当插入cid=1或者3进c1， 当插入cid=2或4进c2分区
</p>
<p>
  insert into articles values (null,&#8217;aaa&#8217;,&#8217;bb&#8217;, 1);
</p>
<p>
  flush table articles;
</p>
<p><img loading="lazy" decoding="async" width="1059" height="455" src="/wp-content/uploads/2018/05/word-image-4869.png" class="wp-image-5378" srcset="/wp-content/uploads/2018/05/word-image-4869.png 1059w, /wp-content/uploads/2018/05/word-image-4869-300x129.png 300w, /wp-content/uploads/2018/05/word-image-4869-768x330.png 768w, /wp-content/uploads/2018/05/word-image-4869-1024x440.png 1024w" sizes="(max-width: 1059px) 100vw, 1059px" /></p>
<h3>5）range分区</h3>
<p>
  #创建一个数据库
</p>
<p>
  create database p4;
</p>
<p>
  #选择数据库
</p>
<p>
  use p4;
</p>
<p>
  #创建数据表并实现range分区
</p>
<p>
  create table user(
</p>
<p>
    id int not null auto_increment,
</p>
<p>
    name varchar(40) not null,
</p>
<p>
    birthday date not null default &#8216;0000-00-00&#8217;,
</p>
<p>
    primary key(id,birthday)
</p>
<p>
  ) engine = myisam default charset = utf8
</p>
<p>
  partition by range(year(birthday)) (
</p>
<p>
    partition 70hou values less than (1980),
</p>
<p>
    partition 80hou values less than (1990),
</p>
<p>
    partition 90hou values less than (2000),
</p>
<p>
    partition 00hou values less than (2010)
</p>
<p>
  );
</p>
<p>
  insert into user values (null,&#8217;a&#8217;,&#8217;1970-01-01&#8242;);
</p>
<p>
  insert into user values (null,&#8217;b&#8217;,&#8217;1980-01-01&#8242;);
</p>
<p>
  insert into user values (null,&#8217;c&#8217;,&#8217;1990-01-01&#8242;);
</p>
<p>
  # 有问题不符合条件
</p>
<p>
  insert into user values (null,&#8217;d&#8217;,&#8217;2011-01-01&#8242;);
</p>
<p><img loading="lazy" decoding="async" width="340" height="160" src="/wp-content/uploads/2018/05/word-image-4870.png" class="wp-image-5379" srcset="/wp-content/uploads/2018/05/word-image-4870.png 340w, /wp-content/uploads/2018/05/word-image-4870-300x141.png 300w" sizes="(max-width: 340px) 100vw, 340px" /><br />
<img loading="lazy" decoding="async" width="1052" height="553" src="/wp-content/uploads/2018/05/word-image-4871.png" class="wp-image-5380" srcset="/wp-content/uploads/2018/05/word-image-4871.png 1052w, /wp-content/uploads/2018/05/word-image-4871-300x158.png 300w, /wp-content/uploads/2018/05/word-image-4871-768x404.png 768w, /wp-content/uploads/2018/05/word-image-4871-1024x538.png 1024w" sizes="(max-width: 1052px) 100vw, 1052px" /></p>
<h2>5、分区管理</h2>
<h3>1、概念</h3>
<ul>
<li>
    取余管理：增加分区-无影响，删除分区-无影响
  </li>
<li>
    条件管理：增加分区-无影响，删除分区-数据丢失
  </li>
</ul>
<h3>取余管理（key，hash）</h3>
<p>
  增加分区数量：alter table 表名 add partition partitions 增加分区的数量
</p>
<p>
  减少分区数量：alter table 表名 coalesce partition 减少分区的数量
</p>
<p><img loading="lazy" decoding="async" width="1075" height="625" src="/wp-content/uploads/2018/05/word-image-4872.png" class="wp-image-5381" srcset="/wp-content/uploads/2018/05/word-image-4872.png 1075w, /wp-content/uploads/2018/05/word-image-4872-300x174.png 300w, /wp-content/uploads/2018/05/word-image-4872-768x447.png 768w, /wp-content/uploads/2018/05/word-image-4872-1024x595.png 1024w" sizes="(max-width: 1075px) 100vw, 1075px" /></p>
<h3>3、条件管理（list，range）</h3>
<p>
  删除分区：alter  table  表名  drop  partition  10hou;
</p>
<p>
  添加分区
</p>
<p>
  alter table tp_user add partition(
</p>
<p>
    partition 10hou values less than (maxvalue)
</p>
<p>
  );
</p>
<p>
  alter table tp_goods add partition(
</p>
<p>
    partition c4 values in (8,9,10)
</p>
<p>
  );
</p>
<p><img loading="lazy" decoding="async" width="930" height="616" src="/wp-content/uploads/2018/05/word-image-4873.png" class="wp-image-5382" srcset="/wp-content/uploads/2018/05/word-image-4873.png 930w, /wp-content/uploads/2018/05/word-image-4873-300x199.png 300w, /wp-content/uploads/2018/05/word-image-4873-768x509.png 768w" sizes="(max-width: 930px) 100vw, 930px" /><br />
<img loading="lazy" decoding="async" width="1102" height="638" src="/wp-content/uploads/2018/05/word-image-4874.png" class="wp-image-5383" srcset="/wp-content/uploads/2018/05/word-image-4874.png 1102w, /wp-content/uploads/2018/05/word-image-4874-300x174.png 300w, /wp-content/uploads/2018/05/word-image-4874-768x445.png 768w, /wp-content/uploads/2018/05/word-image-4874-1024x593.png 1024w" sizes="(max-width: 1102px) 100vw, 1102px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%bd%91%e7%ab%99%e4%bc%98%e5%8c%96/5356.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MongoDB 存储方式、命令、增删改查、索引</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/5082.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/5082.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:24:26 +0000</pubDate>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[命令]]></category>
		<category><![CDATA[增删改查]]></category>
		<category><![CDATA[存储方式]]></category>
		<category><![CDATA[索引]]></category>
		<guid isPermaLink="false">/?p=5082</guid>

					<description><![CDATA[NoSQL（MongoDB） 一、了解MongoDB 1、什么是MongoDB？ 概念 MongoDB是NoS [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>NoSQL（MongoDB）</h1>
<h1><a id="post-5082-_Toc427248665"></a>一、了解MongoDB</h1>
<h2>1、什么是MongoDB？</h2>
<h3>概念 </h3>
<p>
  MongoDB是NoSQL类型的文档型数据库。
</p>
<h3>2）什么是NoSQL？</h3>
<p>
  NoSQL是非关系型数据存储的广义定义，通常以key-value形式存储数据，没
</p>
<p>
  有表结构（注：memcache和redis也市nosql产品）。
</p>
<h3>NoSQL优点</h3>
<p>
  易扩展
</p>
<p>
  快速的读写
</p>
<p>
  低廉的成本
</p>
<p>
  架构的灵活性，没有复杂的关系
</p>
<h3>4）NoSQL缺点</h3>
<p>
  没有标准化
</p>
<p>
  没有正式的官方支持
</p>
<h2>、MongoDB存储方式</h2>
<p>
  mongodb是文档型数据库，文件以BJSON格式存储在硬盘中。
</p>
<p>
  BSON是JSON的一种二进制形式的存储格式.
</p>
<p>
  mongodb内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的JS语法来操作.
</p>
<p><strong>简单总结：</strong>
</p>
<p><strong>mongodb是文档型数据库</strong>
</p>
<p><strong>mongodb、redis、memcache都属于nosql产品</strong>
</p>
<p><strong>什么是nosql：非关系型数据库的广泛定义、一般数据以键值对形式存储，没有表结构</strong>
</p>
<p>
  redis和memcache存在内存中
</p>
<p>
  mongodb存储在磁盘文件中
</p>
<h1>二、MongoDB的安装与配置</h1>
<h2>1、下载</h2>
<p><a href="http://www.mongodb.org/downloads">http://www.mongodb.org/downloads</a>
</p>
<p><img loading="lazy" decoding="async" width="250" height="185" src="/wp-content/uploads/2018/05/word-image-4592.png" class="wp-image-5085" /></p>
<p>
  在32位系统上，数据库文件总共不能超过2G，否无法再插入数据。推荐使用64位操作系统。
</p>
<p>
  安装成功后需要自己创建服务
</p>
<h2>2、安装</h2>
<p><img loading="lazy" decoding="async" width="484" height="386" src="/wp-content/uploads/2018/05/word-image-4593.png" class="wp-image-5086" srcset="/wp-content/uploads/2018/05/word-image-4593.png 484w, /wp-content/uploads/2018/05/word-image-4593-300x239.png 300w" sizes="(max-width: 484px) 100vw, 484px" /><br />
<img loading="lazy" decoding="async" width="482" height="381" src="/wp-content/uploads/2018/05/word-image-4594.png" class="wp-image-5087" srcset="/wp-content/uploads/2018/05/word-image-4594.png 482w, /wp-content/uploads/2018/05/word-image-4594-300x237.png 300w" sizes="(max-width: 482px) 100vw, 482px" /><br />
<img loading="lazy" decoding="async" width="476" height="384" src="/wp-content/uploads/2018/05/word-image-4595.png" class="wp-image-5088" srcset="/wp-content/uploads/2018/05/word-image-4595.png 476w, /wp-content/uploads/2018/05/word-image-4595-300x242.png 300w" sizes="(max-width: 476px) 100vw, 476px" /><br />
<img loading="lazy" decoding="async" width="482" height="380" src="/wp-content/uploads/2018/05/word-image-4596.png" class="wp-image-5089" srcset="/wp-content/uploads/2018/05/word-image-4596.png 482w, /wp-content/uploads/2018/05/word-image-4596-300x237.png 300w" sizes="(max-width: 482px) 100vw, 482px" /><br />
<img loading="lazy" decoding="async" width="487" height="381" src="/wp-content/uploads/2018/05/word-image-4597.png" class="wp-image-5090" srcset="/wp-content/uploads/2018/05/word-image-4597.png 487w, /wp-content/uploads/2018/05/word-image-4597-300x235.png 300w" sizes="(max-width: 487px) 100vw, 487px" /><br />
<img loading="lazy" decoding="async" width="490" height="384" src="/wp-content/uploads/2018/05/word-image-4598.png" class="wp-image-5091" srcset="/wp-content/uploads/2018/05/word-image-4598.png 490w, /wp-content/uploads/2018/05/word-image-4598-300x235.png 300w" sizes="(max-width: 490px) 100vw, 490px" /><br />
<img loading="lazy" decoding="async" width="481" height="379" src="/wp-content/uploads/2018/05/word-image-4599.png" class="wp-image-5092" srcset="/wp-content/uploads/2018/05/word-image-4599.png 481w, /wp-content/uploads/2018/05/word-image-4599-300x236.png 300w" sizes="(max-width: 481px) 100vw, 481px" /><br />
<img loading="lazy" decoding="async" width="479" height="217" src="/wp-content/uploads/2018/05/word-image-4600.png" class="wp-image-5093" srcset="/wp-content/uploads/2018/05/word-image-4600.png 479w, /wp-content/uploads/2018/05/word-image-4600-300x136.png 300w" sizes="(max-width: 479px) 100vw, 479px" /></p>
<h2>3、创建MongoDB 服务</h2>
<ul>
<li>
    前    提：在mongodb安装目录下创建data目录用于存放后期数据
  </li>
<li>
    创建服务：mongod &#8211;install &#8211;dbpath 数据目录 &#8211;logpath 日志文件
  </li>
<li>
    删除服务：mongod &#8211;remove
  </li>
<li>
    启动服务：net start MongoDB
  </li>
<li>
    关闭服务：net stop MongoDB
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1012" height="670" src="/wp-content/uploads/2018/05/word-image-4601.png" class="wp-image-5094" srcset="/wp-content/uploads/2018/05/word-image-4601.png 1012w, /wp-content/uploads/2018/05/word-image-4601-300x199.png 300w, /wp-content/uploads/2018/05/word-image-4601-768x508.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></p>
<h2>4、连接MongoDB服务器</h2>
<p>
  语法：mongo 服务ip地址:端口/数据库名
</p>
<p>
  简写：mongo
</p>
<p>
  默认端口27017
</p>
<p><img loading="lazy" decoding="async" width="281" height="117" src="/wp-content/uploads/2018/05/word-image-4602.png" class="wp-image-5095" /></p>
<p>
  或者
</p>
<p><img loading="lazy" decoding="async" width="404" height="120" src="/wp-content/uploads/2018/05/word-image-4603.png" class="wp-image-5096" srcset="/wp-content/uploads/2018/05/word-image-4603.png 404w, /wp-content/uploads/2018/05/word-image-4603-300x89.png 300w" sizes="(max-width: 404px) 100vw, 404px" /></p>
<h1>三、Mongodb基本概念</h1>
<ul>
<li>
    MySQL数据库中有：数据库（Database）、表（table）、记录（Record）
  </li>
<li>
    mongodb数据库中有：数据库（database）、集合（collection）、文档（document）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="459" height="251" src="/wp-content/uploads/2018/05/word-image-4604.png" class="wp-image-5097" srcset="/wp-content/uploads/2018/05/word-image-4604.png 459w, /wp-content/uploads/2018/05/word-image-4604-300x164.png 300w" sizes="(max-width: 459px) 100vw, 459px" /></p>
<p>
  MongoDB集合对应关系型数据库里的表，但是集合中没有列、行和关系概念，这体现了模式自由的特点。
</p>
<h1>四、入门命令</h1>
<h2>1、库和集合操作</h2>
<h3># 查看已有数据库</h3>
<p>
  语法：show databases; 或者 show dbs;
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="272" height="169" src="/wp-content/uploads/2018/05/word-image-4605.png" class="wp-image-5098" /></p>
<h3># 选择数据库</h3>
<p>
  语法：use 数据库
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="463" height="335" src="/wp-content/uploads/2018/05/word-image-4606.png" class="wp-image-5099" srcset="/wp-content/uploads/2018/05/word-image-4606.png 463w, /wp-content/uploads/2018/05/word-image-4606-300x217.png 300w" sizes="(max-width: 463px) 100vw, 463px" /></p>
<h3># 查看已有的集合/表</h3>
<p>
  语法：show collections 或者 show table
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="256" height="114" src="/wp-content/uploads/2018/05/word-image-4607.png" class="wp-image-5100" /></p>
<h3># 创建集合（表）</h3>
<p>
  语法：db.createCollection（集合名）
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="430" height="195" src="/wp-content/uploads/2018/05/word-image-4608.png" class="wp-image-5101" srcset="/wp-content/uploads/2018/05/word-image-4608.png 430w, /wp-content/uploads/2018/05/word-image-4608-300x136.png 300w" sizes="(max-width: 430px) 100vw, 430px" /></p>
<p>
  ︴是否可以验证数据库是否自动创建
</p>
<p><img loading="lazy" decoding="async" width="449" height="334" src="/wp-content/uploads/2018/05/word-image-4609.png" class="wp-image-5102" srcset="/wp-content/uploads/2018/05/word-image-4609.png 449w, /wp-content/uploads/2018/05/word-image-4609-300x223.png 300w" sizes="(max-width: 449px) 100vw, 449px" /></p>
<h3># 删除集合表</h3>
<p>
  语法：db.集合名.drop()
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="307" height="236" src="/wp-content/uploads/2018/05/word-image-4610.png" class="wp-image-5103" srcset="/wp-content/uploads/2018/05/word-image-4610.png 307w, /wp-content/uploads/2018/05/word-image-4610-300x231.png 300w" sizes="(max-width: 307px) 100vw, 307px" /></p>
<p>
  删除库：db.dropDatabase();
</p>
<p><img loading="lazy" decoding="async" width="391" height="202" src="/wp-content/uploads/2018/05/word-image-4611.png" class="wp-image-5104" srcset="/wp-content/uploads/2018/05/word-image-4611.png 391w, /wp-content/uploads/2018/05/word-image-4611-300x155.png 300w" sizes="(max-width: 391px) 100vw, 391px" /></p>
<h2>2、增删修查（CURD）</h2>
<h3># C 增</h3>
<ul>
<li>
    语法：db.集合名.insert（json数据）
  </li>
<li>
    说明：集合存在-则直接插入数据，集合不存在-则插入数据时自动创建
  </li>
<li>
    举例：插入到test集合中，姓名叫zs年龄18岁
  </li>
</ul>
<p>
  db.test.insert({name:&#8217;zs&#8217;,age:18});
</p>
<p><img loading="lazy" decoding="async" width="769" height="502" src="/wp-content/uploads/2018/05/word-image-4612.png" class="wp-image-5105" srcset="/wp-content/uploads/2018/05/word-image-4612.png 769w, /wp-content/uploads/2018/05/word-image-4612-300x196.png 300w, /wp-content/uploads/2018/05/word-image-4612-768x501.png 768w" sizes="(max-width: 769px) 100vw, 769px" /></p>
<p>
  插入成功自动创建一个唯一的ID
</p>
<p><img loading="lazy" decoding="async" width="503" height="88" src="/wp-content/uploads/2018/05/word-image.jpeg" class="wp-image-5106" srcset="/wp-content/uploads/2018/05/word-image.jpeg 503w, /wp-content/uploads/2018/05/word-image-300x52.jpeg 300w" sizes="(max-width: 503px) 100vw, 503px" /></p>
<p><strong>︴思考1：是否可以自定义_id值？</strong>
</p>
<p>
  答：可以，插入的时候增加_id键即可替换
</p>
<p><img loading="lazy" decoding="async" width="750" height="508" src="/wp-content/uploads/2018/05/word-image-4613.png" class="wp-image-5107" srcset="/wp-content/uploads/2018/05/word-image-4613.png 750w, /wp-content/uploads/2018/05/word-image-4613-300x203.png 300w, /wp-content/uploads/2018/05/word-image-4613-220x150.png 220w" sizes="(max-width: 750px) 100vw, 750px" /></p>
<p><strong>︴思考2：如何插入多条记录？</strong>
</p>
<p>
  答：可以
</p>
<p>
  语法：db.集合名.insert([
</p>
<p>
  {},
</p>
<p>
  {},
</p>
<p>
  {}
</p>
<p>
  ]);
</p>
<p><img loading="lazy" decoding="async" width="757" height="573" src="/wp-content/uploads/2018/05/word-image-4614.png" class="wp-image-5108" srcset="/wp-content/uploads/2018/05/word-image-4614.png 757w, /wp-content/uploads/2018/05/word-image-4614-300x227.png 300w" sizes="(max-width: 757px) 100vw, 757px" /></p>
<p><strong>︴扩展练习：结合js循环插入多条记录？</strong>
</p>
<p>
  循环：for
</p>
<p>
  打印：print(变量名);
</p>
<p>
  案例：循环显示1-10
</p>
<p><img loading="lazy" decoding="async" width="531" height="288" src="/wp-content/uploads/2018/05/word-image-4615.png" class="wp-image-5110" srcset="/wp-content/uploads/2018/05/word-image-4615.png 531w, /wp-content/uploads/2018/05/word-image-4615-300x163.png 300w" sizes="(max-width: 531px) 100vw, 531px" /></p>
<p>
  需求：在test集合中循环插入8条数据：格式 name:heng自增  age:自增
</p>
<p>
  for (var i =1; i&lt;=8; i++) {
</p>
<p>
  db.test.insert({name:&#8221;heng&#8221;+i, age:i});
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="768" height="525" src="/wp-content/uploads/2018/05/word-image-4616.png" class="wp-image-5111" srcset="/wp-content/uploads/2018/05/word-image-4616.png 768w, /wp-content/uploads/2018/05/word-image-4616-300x205.png 300w, /wp-content/uploads/2018/05/word-image-4616-220x150.png 220w" sizes="(max-width: 768px) 100vw, 768px" /></p>
<h3># D 删</h3>
<ul>
<li>
    语法：db.集合名.remove（条件，是否删除一条）
  </li>
<li>
    说明：
  </li>
<li>
    条件，就是写json格式数据
  </li>
<li>
    是否删除一条：true-是，false-否（默认）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="777" height="378" src="/wp-content/uploads/2018/05/word-image-4617.png" class="wp-image-5112" srcset="/wp-content/uploads/2018/05/word-image-4617.png 777w, /wp-content/uploads/2018/05/word-image-4617-300x146.png 300w, /wp-content/uploads/2018/05/word-image-4617-768x374.png 768w" sizes="(max-width: 777px) 100vw, 777px" /><br />
<img loading="lazy" decoding="async" width="730" height="376" src="/wp-content/uploads/2018/05/word-image-4618.png" class="wp-image-5113" srcset="/wp-content/uploads/2018/05/word-image-4618.png 730w, /wp-content/uploads/2018/05/word-image-4618-300x155.png 300w" sizes="(max-width: 730px) 100vw, 730px" /><br />
<img loading="lazy" decoding="async" width="359" height="105" src="/wp-content/uploads/2018/05/word-image-4619.png" class="wp-image-5114" srcset="/wp-content/uploads/2018/05/word-image-4619.png 359w, /wp-content/uploads/2018/05/word-image-4619-300x88.png 300w" sizes="(max-width: 359px) 100vw, 359px" /></p>
<h3># U 改</h3>
<p>
  # 创建测试数据
</p>
<p>
  use test1;
</p>
<p>
  db.createCollection(&#8220;c1&#8221;);
</p>
<p>
  for(var i = 1; i&lt;= 10; i++){
</p>
<p>
      db.c1.insert( {&#8220;name&#8221;:&#8221;zs&#8221;+i,&#8221;age&#8221;:i} );
</p>
<p>
  }
</p>
<ul>
<li>
    语法：db.集合名.update（条件，新数据，是否新增，是否只修改多条）
  </li>
<li>
    说明：
  </li>
<li>
    参数3：是否新增（true-找不到则插入，false-找不到就不管，默认）
  </li>
<li>
    参数4：是否修改多条（true-全部修改，false-只修改一条，默认）
  </li>
</ul>
<p><strong>︴练习1：将{name:</strong>&#8220;<strong>zs1</strong>&#8220;<strong>}改为{name:</strong>&#8220;<strong>zs2</strong>&#8220;<strong>}</strong>
</p>
<p>
  db.c1.update({name:&#8221;zs1&#8243;}, {name:&#8221;zs2&#8243;});
</p>
<p><img loading="lazy" decoding="async" width="725" height="505" src="/wp-content/uploads/2018/05/word-image-4620.png" class="wp-image-5115" srcset="/wp-content/uploads/2018/05/word-image-4620.png 725w, /wp-content/uploads/2018/05/word-image-4620-300x209.png 300w" sizes="(max-width: 725px) 100vw, 725px" /></p>
<p><strong>︴思考1：如何解决练习1的（替换）问题？</strong>
</p>
<p>
  发现：上述代码不是修改，而是替换新数据
</p>
<p>
  解决：通过（修改器）
</p>
<p>
  语法：db.集合名.update（条件，<strong>{修改器:</strong>{键:值}<strong>}</strong>）
</p>
<p>
  需求：将age=2的数据name改成zs22
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p><strong>原本操作：db.c1.update({age:2}, {name:&#8221;zs22&#8243;});</strong>
</p>
<p><strong>瑕疵：替换数据</strong>
</p>
<p><strong>解决：使用修改器（$set）</strong>
</p>
<p><strong>套用语法：db.c1.update（{age:2}，{$set:{name:&#8221;zs22&#8243;}}）</strong>
</p>
<p><img loading="lazy" decoding="async" width="709" height="315" src="/wp-content/uploads/2018/05/word-image-4621.png" class="wp-image-5116" srcset="/wp-content/uploads/2018/05/word-image-4621.png 709w, /wp-content/uploads/2018/05/word-image-4621-300x133.png 300w" sizes="(max-width: 709px) 100vw, 709px" /></p>
<p><strong>︴练习2：给{name:</strong>&#8220;<strong>zs10</strong>&#8220;<strong>}的年龄加2岁</strong>
</p>
<p>
  db.c1.update({name:&#8221;zs10&#8243;},{$inc: {age:2}});
</p>
<p><img loading="lazy" decoding="async" width="733" height="482" src="/wp-content/uploads/2018/05/word-image-4622.png" class="wp-image-5117" srcset="/wp-content/uploads/2018/05/word-image-4622.png 733w, /wp-content/uploads/2018/05/word-image-4622-300x197.png 300w" sizes="(max-width: 733px) 100vw, 733px" /></p>
<p>
  多学一招：思考如何减年龄
</p>
<p>
  回答：负数
</p>
<p>
  db.c1.update({name:&#8221;zs10&#8243;},{$inc: {age:-2}});
</p>
<p><img loading="lazy" decoding="async" width="787" height="481" src="/wp-content/uploads/2018/05/word-image-4623.png" class="wp-image-5118" srcset="/wp-content/uploads/2018/05/word-image-4623.png 787w, /wp-content/uploads/2018/05/word-image-4623-300x183.png 300w, /wp-content/uploads/2018/05/word-image-4623-768x469.png 768w" sizes="(max-width: 787px) 100vw, 787px" /></p>
<p><strong>︴练习3（修改器综合练习）：</strong>
</p>
<ul>
<li>
    数据：
  </li>
</ul>
<p>
  db.test3.insert( {name:&#8221;猪八戒&#8221;,age:888,who:&#8221;男&#8221;,other:&#8221;非国人&#8221;});
</p>
<ul>
<li>
    需求：
  </li>
</ul>
<p>
  name  改成  孙悟空      ( 修改器：$set)
</p>
<p>
  age    增加  111	      ( 修改器：$inc)
</p>
<p>
  who   改字段   sex	   ( 修改器：$rename)
</p>
<p>
  other 删除			 	   (修改器：$unset)
</p>
<p>
  db.test3.update(条件，                );
</p>
<p>
                            {修改器:{键:值}}
</p>
<p>
                            {$set:{name:&#8221;猴子&#8221;}}
</p>
<p>
                            {$inc:{age:111}}
</p>
<p>
                            {$rename:{who:&#8221;sex&#8221;}}
</p>
<p>
                            {$unset:{other:&#8221;非国人&#8221;}}
</p>
<p>
  组合一起使用修改器
</p>
<p>
  db.test3.update({name:&#8221;猪八戒&#8221;}, {
</p>
<p>
  $set:{name:&#8221;猴子&#8221;},
</p>
<p>
  $inc:{age:111},
</p>
<p>
  $rename:{who:&#8221;sex&#8221;},
</p>
<p>
  $unset:{other:&#8221;非国人&#8221;}
</p>
<p>
  });
</p>
<p><img loading="lazy" decoding="async" width="1081" height="292" src="/wp-content/uploads/2018/05/word-image-4624.png" class="wp-image-5119" srcset="/wp-content/uploads/2018/05/word-image-4624.png 1081w, /wp-content/uploads/2018/05/word-image-4624-300x81.png 300w, /wp-content/uploads/2018/05/word-image-4624-768x207.png 768w, /wp-content/uploads/2018/05/word-image-4624-1024x277.png 1024w" sizes="(max-width: 1081px) 100vw, 1081px" /></p>
<p><strong>︴练习4：验证语法最后两个参数：</strong>是否新增[默认false], 是否修改多条[默认false]
</p>
<ul>
<li>
    验证是否新增：修改name 等于 zs30的年龄 30岁
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="835" height="597" src="/wp-content/uploads/2018/05/word-image-4625.png" class="wp-image-5120" srcset="/wp-content/uploads/2018/05/word-image-4625.png 835w, /wp-content/uploads/2018/05/word-image-4625-300x214.png 300w, /wp-content/uploads/2018/05/word-image-4625-768x549.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></p>
<ul>
<li>
    验证是否修改多条：修改name 等于 zs2的年龄 22岁
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="775" height="335" src="/wp-content/uploads/2018/05/word-image-4626.png" class="wp-image-5121" srcset="/wp-content/uploads/2018/05/word-image-4626.png 775w, /wp-content/uploads/2018/05/word-image-4626-300x130.png 300w, /wp-content/uploads/2018/05/word-image-4626-768x332.png 768w" sizes="(max-width: 775px) 100vw, 775px" /></p>
<h3># R 查</h3>
<ul>
<li>
    语法：db.集合名.find（条件[，查询的列]）
  </li>
<li>
    查询条件说明：
  </li>
<li>
    {name:&#8221;zs&#8221;}   		   查询name等于zs的数据
  </li>
<li>
    {age:18}      			查询age等于18的数据
  </li>
<li>
    {name:&#8221;zs&#8221;, age:18}     查询name等于zs并且age等于18的数据
  </li>
<li>
    查询的列说明
  </li>
<li>
    {name:1}   		   查询的数据只显示name字段
  </li>
<li>
    {name:0}      		查询的数据显示所有字段，除name意外
  </li>
<li>
    {name:1, age:0}     只查询name字段
  </li>
</ul>
<p><strong>︴练习：查询所有数据</strong>
</p>
<p><img loading="lazy" decoding="async" width="749" height="199" src="/wp-content/uploads/2018/05/word-image-4627.png" class="wp-image-5122" srcset="/wp-content/uploads/2018/05/word-image-4627.png 749w, /wp-content/uploads/2018/05/word-image-4627-300x80.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p><strong>︴思考1：查询年龄大于5岁的数据？</strong>
</p>
<p><img loading="lazy" decoding="async" width="749" height="397" src="/wp-content/uploads/2018/05/word-image-4628.png" class="wp-image-5123" srcset="/wp-content/uploads/2018/05/word-image-4628.png 749w, /wp-content/uploads/2018/05/word-image-4628-300x159.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p>
  语法：db.test.find({键:{修改器:值}});
</p>
<p>
  案例：db.test.find({age:{$gt:5}});
</p>
<p><img loading="lazy" decoding="async" width="739" height="121" src="/wp-content/uploads/2018/05/word-image-4629.png" class="wp-image-5124" srcset="/wp-content/uploads/2018/05/word-image-4629.png 739w, /wp-content/uploads/2018/05/word-image-4629-300x49.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></p>
<p><strong>︴思考2：查询年龄是5岁、8岁、10岁的数据？</strong>
</p>
<p>
  案例：db.test.find({age:{$in:[5,8,10]}});
</p>
<p><img loading="lazy" decoding="async" width="714" height="90" src="/wp-content/uploads/2018/05/word-image-4630.png" class="wp-image-5125" srcset="/wp-content/uploads/2018/05/word-image-4630.png 714w, /wp-content/uploads/2018/05/word-image-4630-300x38.png 300w" sizes="(max-width: 714px) 100vw, 714px" /></p>
<h1>总结</h1>
<p>
  什么是Mongodb：nosql类型的文档型数据库
</p>
<p>
  什么是nosql：非关系型数据库的广泛定义，一般以键值对象形式存储，不需要设计表结构的数据库可以称之为
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
  【安装】
</p>
<p>
  安装服务：mongod &#8211;install &#8211;dbpath=数据目录 &#8211;logpath=日志文件
</p>
<p>
  卸载服务：mongod &#8211;remove
</p>
<p>
  启动服务：net start MongoDB
</p>
<p>
  停止服务：net stop  MongoDB
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
  【入门命令】
</p>
<p>
  查看数据库： show databases; 或 show dbs;
</p>
<p>
  查看集合/表：show tables;  或  show collections;
</p>
<p>
  选择数据库： use 数据库名（注：不存在不会报错，后期插入数据会自动创建）
</p>
<p>
  创建集合：   db.createCollection（集合名）
</p>
<p>
  删除集合：   db.集合名.drop();
</p>
<p>
  删除数据库： db.dropDatabase();
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  【增】
</p>
<p>
  语法：db.集合名.insert（json数据）
</p>
<p>
  说明：集合存在-则直接插入数据，不存在-则创建
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  【删】
</p>
<p>
  语法：db.集合名.remove（条件，是否删除一条）
</p>
<p>
  说明：是否删除一条（true-是，false-否，默认）
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  【改】
</p>
<p>
  语法：db.集合名.update（条件，新数据，是否新增，是否删除多条）
</p>
<p>
  说明：
</p>
<p>
  参数3：是否新增（true-未匹配数据则新增，false匹配到数据则修改，默认）
</p>
<p>
  参数4：是否删除多条（true-删除多条，false-只删一条，默认）
</p>
<p>
  单修改器语法：db.集合名.update（条件，{修改器:{键:值}}）
</p>
<p>
  多修改器语法：db.集合名.update（条件，{
</p>
<p>
  修改器:{键:值},
</p>
<p>
  修改器:{键:值},
</p>
<p>
  修改器:{键:值}
</p>
<p>
  }）
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  【查】
</p>
<p>
  语法1：db.集合名.find(条件，查询的列)
</p>
<p>
  语法2：db.集合名.findOne();
</p>
<p><img loading="lazy" decoding="async" width="492" height="165" src="/wp-content/uploads/2018/05/word-image-4631.png" class="wp-image-5126" srcset="/wp-content/uploads/2018/05/word-image-4631.png 492w, /wp-content/uploads/2018/05/word-image-4631-300x101.png 300w" sizes="(max-width: 492px) 100vw, 492px" /></p>
<p>
  格式化打印：find().pretty()
</p>
<h1>五、MongoDB的权限机制</h1>
<h2><a id="post-5082-_Toc451356829"></a>1、权限机制概述</h2>
<p>
  在mongodb里面的用户是属于数据库的，每个数据库有自己的管理员，管理员登录后，只能操作所属的数据库。
</p>
<p><img loading="lazy" decoding="async" width="845" height="362" src="/wp-content/uploads/2018/05/word-image-4632.png" class="wp-image-5127" srcset="/wp-content/uploads/2018/05/word-image-4632.png 845w, /wp-content/uploads/2018/05/word-image-4632-300x129.png 300w, /wp-content/uploads/2018/05/word-image-4632-768x329.png 768w" sizes="(max-width: 845px) 100vw, 845px" /></p>
<p>
  3.x.x版本默认看不到admin数据库，但是可以选择并查看对应的表；
</p>
<p>
  2.x.x版本 通过show dbs 可以直接查看admin数据库
</p>
<h2>开启验证模式</h2>
<h3>1）概念</h3>
<p>
  开启验证模式：就是登陆需要输入账号密码
</p>
<p>
  先登陆创建超级管理员
</p>
<p>
  然后卸载服务
</p>
<p>
  再通过验证模式开启服务（说白了，增加参数让后期输入账号密码才可以登陆）
</p>
<h3>2）添加超级管理员</h3>
<ul>
<li>
    步骤1：登录
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="275" height="135" src="/wp-content/uploads/2018/05/word-image-4633.png" class="wp-image-5128" /></p>
<ul>
<li>
    步骤2：选择admin数据库
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="218" height="104" src="/wp-content/uploads/2018/05/word-image-4634.png" class="wp-image-5129" /></p>
<ul>
<li>
    步骤3：在admin数据库中添加用户（超级管理员）
  </li>
</ul>
<p>
  db.createUser({
</p>
<p>
  &#8220;user&#8221; : &#8220;admin&#8221;,
</p>
<p>
  &#8220;pwd&#8221;: &#8220;admin888&#8221;,
</p>
<p>
  &#8220;customData&#8221; : {employeeId:&#8221;提示密码admin888&#8243;},
</p>
<p>
  &#8220;roles&#8221; : [{
</p>
<p>
  role: &#8220;root&#8221;,
</p>
<p>
  db: &#8220;admin&#8221;
</p>
<p>
  }]
</p>
<p>
  })
</p>
<p><img loading="lazy" decoding="async" width="488" height="397" src="/wp-content/uploads/2018/05/word-image-4635.png" class="wp-image-5130" srcset="/wp-content/uploads/2018/05/word-image-4635.png 488w, /wp-content/uploads/2018/05/word-image-4635-300x244.png 300w" sizes="(max-width: 488px) 100vw, 488px" /></p>
<p>
  user 			代表登录的用户名
</p>
<p>
  pwd  				代表登录的密码
</p>
<p>
  customData	备注
</p>
<p>
  role				角色
</p>
<p>
  db					所属数据库
</p>
<p>
  角色信息介绍
</p>
<p><img loading="lazy" decoding="async" width="662" height="334" src="/wp-content/uploads/2018/05/word-image-4636.png" class="wp-image-5131" srcset="/wp-content/uploads/2018/05/word-image-4636.png 662w, /wp-content/uploads/2018/05/word-image-4636-300x151.png 300w" sizes="(max-width: 662px) 100vw, 662px" /></p>
<p>
  角色作用
</p>
<p><img loading="lazy" decoding="async" width="869" height="336" src="/wp-content/uploads/2018/05/word-image-4637.png" class="wp-image-5132" srcset="/wp-content/uploads/2018/05/word-image-4637.png 869w, /wp-content/uploads/2018/05/word-image-4637-300x116.png 300w, /wp-content/uploads/2018/05/word-image-4637-768x297.png 768w" sizes="(max-width: 869px) 100vw, 869px" /></p>
<h3>3）重新以验证模式启动mongod服务</h3>
<ul>
<li>
    步骤1：卸载服务
  </li>
</ul>
<p>
  net stop MongoDB
</p>
<p>
  mongod &#8211;remove
</p>
<ul>
<li>
    步骤2：开启验证模式服务（参数&#8211;auth）
  </li>
</ul>
<p>
  mongod &#8211;install &#8211;dbpath=E:\mongodb\data &#8211;logpath=E:\mongodb\log1.txt <strong>&#8211;auth</strong>
</p>
<p><img loading="lazy" decoding="async" width="884" height="82" src="/wp-content/uploads/2018/05/word-image-4638.png" class="wp-image-5133" srcset="/wp-content/uploads/2018/05/word-image-4638.png 884w, /wp-content/uploads/2018/05/word-image-4638-300x28.png 300w, /wp-content/uploads/2018/05/word-image-4638-768x71.png 768w" sizes="(max-width: 884px) 100vw, 884px" /></p>
<ul>
<li>
    步骤3：启动服务
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="770" height="407" src="/wp-content/uploads/2018/05/word-image-4639.png" class="wp-image-5134" srcset="/wp-content/uploads/2018/05/word-image-4639.png 770w, /wp-content/uploads/2018/05/word-image-4639-300x159.png 300w, /wp-content/uploads/2018/05/word-image-4639-768x406.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></p>
<h2>通过超级管理员账号登陆</h2>
<ul>
<li>
    mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="633" height="210" src="/wp-content/uploads/2018/05/word-image-4640.png" class="wp-image-5135" srcset="/wp-content/uploads/2018/05/word-image-4640.png 633w, /wp-content/uploads/2018/05/word-image-4640-300x100.png 300w" sizes="(max-width: 633px) 100vw, 633px" /></p>
<ul>
<li>
    登录之后输入，db.auth（用户名，密码）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="621" height="539" src="/wp-content/uploads/2018/05/word-image-4641.png" class="wp-image-5136" srcset="/wp-content/uploads/2018/05/word-image-4641.png 621w, /wp-content/uploads/2018/05/word-image-4641-300x260.png 300w" sizes="(max-width: 621px) 100vw, 621px" /></p>
<h2>︴课堂案例：</h2>
<h3>■ 需求</h3>
<p>
  添加用户shop1可以读shop数据库
</p>
<p>
  添加用户shop2可以读写shop数据库
</p>
<p>
  脚下留心：必须在对应数据库创建用户
</p>
<h3>1）创建测试数据和测试用户（注：选择shop仓库创建用户）</h3>
<p>
  use shop;
</p>
<p>
  for(var i=1; i&lt;=10; i++) {
</p>
<p>
      db.goods.insert({&#8220;name&#8221;:&#8221;goodsName&#8221;+i,&#8221;price&#8221;:i});
</p>
<p>
  }
</p>
<h3>2）添加用户并设置权限</h3>
<p>
  【shop1】
</p>
<p>
  db.createUser({
</p>
<p>
  &#8220;user&#8221; : &#8220;shop1&#8221;,
</p>
<p>
  &#8220;pwd&#8221;: &#8220;admin888&#8221;,
</p>
<p>
  &#8220;customData&#8221; : {employeeId:&#8221;提示密码admin888&#8243;},
</p>
<p>
  &#8220;roles&#8221; : [{
</p>
<p>
  role: &#8220;read&#8221;,
</p>
<p>
  db: &#8220;shop&#8221;
</p>
<p>
  }]
</p>
<p>
  })
</p>
<p>
  【shop2】
</p>
<p>
  db.createUser({
</p>
<p>
  &#8220;user&#8221; : &#8220;shop2&#8221;,
</p>
<p>
  &#8220;pwd&#8221;: &#8220;admin888&#8221;,
</p>
<p>
  &#8220;customData&#8221; : {employeeId:&#8221;提示密码admin888&#8243;},
</p>
<p>
  &#8220;roles&#8221; : [{
</p>
<p>
  role: &#8220;readWrite&#8221;,
</p>
<p>
  db: &#8220;shop&#8221;
</p>
<p>
  }]
</p>
<p>
  })
</p>
<h3>验证：shop1可读</h3>
<p><img loading="lazy" decoding="async" width="597" height="420" src="/wp-content/uploads/2018/05/word-image-4642.png" class="wp-image-5137" srcset="/wp-content/uploads/2018/05/word-image-4642.png 597w, /wp-content/uploads/2018/05/word-image-4642-300x211.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></p>
<h3>3）验证：shop2验证可读可写</h3>
<p><img loading="lazy" decoding="async" width="821" height="573" src="/wp-content/uploads/2018/05/word-image-4643.png" class="wp-image-5138" srcset="/wp-content/uploads/2018/05/word-image-4643.png 821w, /wp-content/uploads/2018/05/word-image-4643-300x209.png 300w, /wp-content/uploads/2018/05/word-image-4643-768x536.png 768w" sizes="(max-width: 821px) 100vw, 821px" /></p>
<h1>六、MongoDB的索引</h1>
<h2>1、情景设置</h2>
<p>
  向数据库中新增十万条数据
</p>
<p>
  //选择数据库
</p>
<p>
  use test;
</p>
<p>
  //向数据库中添加数据
</p>
<p>
  for(var i=0;i&lt;100000;i++){
</p>
<p>
  db.data1.insert({&#8216;name&#8217;:&#8221;aaa&#8221;+i,&#8221;age&#8221;:i});
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="661" height="168" src="/wp-content/uploads/2018/05/word-image-4644.png" class="wp-image-5139" srcset="/wp-content/uploads/2018/05/word-image-4644.png 661w, /wp-content/uploads/2018/05/word-image-4644-300x76.png 300w" sizes="(max-width: 661px) 100vw, 661px" /></p>
<h2>2、索引的建立</h2>
<h3>1）语法</h3>
<ul>
<li>
    创建索引语法：db.集合名.createIndex（待创建索引字段，额外选项）
  </li>
<li>
    参数：
  </li>
<li>
    待创建索引字段，语法：{键:1，键:-1}（说明：1表示升序，-1表示降序） ，如：
  </li>
</ul>
<p>
  {age:1}表示给age创建索引并且按照升序的方式存储
</p>
<ul>
<li>
    额外选项，可以设置索引名称，设置唯一索引等
  </li>
<li>
    删除索引语法：
  </li>
<li>
    db.集合名.dropIndexes（）  		删除全部索引
  </li>
<li>
    db.集合名.dropIndex（索引名）	删除指定索引
  </li>
<li>
    查看索引语法：db.集合名.getIndexes（）
  </li>
</ul>
<h3>创建普通索引</h3>
<p>
  需求：给name添加普通索引
</p>
<p>
  语法：
</p>
<p><img loading="lazy" decoding="async" width="557" height="495" src="/wp-content/uploads/2018/05/word-image-4645.png" class="wp-image-5140" srcset="/wp-content/uploads/2018/05/word-image-4645.png 557w, /wp-content/uploads/2018/05/word-image-4645-300x267.png 300w" sizes="(max-width: 557px) 100vw, 557px" /></p>
<p>
  删除索引
</p>
<p><img loading="lazy" decoding="async" width="430" height="327" src="/wp-content/uploads/2018/05/word-image-4646.png" class="wp-image-5141" srcset="/wp-content/uploads/2018/05/word-image-4646.png 430w, /wp-content/uploads/2018/05/word-image-4646-300x228.png 300w" sizes="(max-width: 430px) 100vw, 430px" /></p>
<p>
  给name创建索引并起名chenheng
</p>
<p><img loading="lazy" decoding="async" width="610" height="520" src="/wp-content/uploads/2018/05/word-image-4647.png" class="wp-image-5142" srcset="/wp-content/uploads/2018/05/word-image-4647.png 610w, /wp-content/uploads/2018/05/word-image-4647-300x256.png 300w" sizes="(max-width: 610px) 100vw, 610px" /></p>
<h3>创建复合/组合索引</h3>
<p>
  需求：给name和age添加组合索引
</p>
<p>
  说明：组合/符合索引就是给两个字段同时加索引（复习：mysql中index(字段1，字段2)）
</p>
<p>
  语法：db.集合名.createIndex({键:值,键:值});
</p>
<p><img loading="lazy" decoding="async" width="621" height="702" src="/wp-content/uploads/2018/05/word-image-4648.png" class="wp-image-5143" srcset="/wp-content/uploads/2018/05/word-image-4648.png 621w, /wp-content/uploads/2018/05/word-image-4648-265x300.png 265w" sizes="(max-width: 621px) 100vw, 621px" /></p>
<h3>创建唯一索引</h3>
<p>
  需求：给name添加普通索引
</p>
<p>
  语法：db.集合名.createIndex(待添加索引的字段，{unique:true})
</p>
<p>
  【设置索引特性】
</p>
<p>
  【测试唯一索引特性】
</p>
<p><img loading="lazy" decoding="async" width="936" height="431" src="/wp-content/uploads/2018/05/word-image-4649.png" class="wp-image-5144" srcset="/wp-content/uploads/2018/05/word-image-4649.png 936w, /wp-content/uploads/2018/05/word-image-4649-300x138.png 300w, /wp-content/uploads/2018/05/word-image-4649-768x354.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></p>
<h2>3、分析索引（explain） executionStats</h2>
<ul>
<li>
    语法：db.集合名.find().explain(&#8216;executionStats&#8217;)
  </li>
<li>
    说明：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="675" height="672" src="/wp-content/uploads/2018/05/word-image-4650.png" class="wp-image-5145" srcset="/wp-content/uploads/2018/05/word-image-4650.png 675w, /wp-content/uploads/2018/05/word-image-4650-150x150.png 150w, /wp-content/uploads/2018/05/word-image-4650-300x300.png 300w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<p>
  COLLSCAN 全表扫描
</p>
<p>
  IXSCAN  索引扫描
</p>
<p>
  FETCH   根据索引去检索指定document
</p>
<ul>
<li>
    练习：
  </li>
</ul>
<p>
  age未添加索引情况
</p>
<p><img loading="lazy" decoding="async" width="498" height="62" src="/wp-content/uploads/2018/05/word-image-4651.png" class="wp-image-5146" srcset="/wp-content/uploads/2018/05/word-image-4651.png 498w, /wp-content/uploads/2018/05/word-image-4651-300x37.png 300w" sizes="(max-width: 498px) 100vw, 498px" /><br />
<img loading="lazy" decoding="async" width="639" height="370" src="/wp-content/uploads/2018/05/word-image-4652.png" class="wp-image-5147" srcset="/wp-content/uploads/2018/05/word-image-4652.png 639w, /wp-content/uploads/2018/05/word-image-4652-300x174.png 300w" sizes="(max-width: 639px) 100vw, 639px" /></p>
<p>
  age添加索引情况
</p>
<p><img loading="lazy" decoding="async" width="511" height="508" src="/wp-content/uploads/2018/05/word-image-4653.png" class="wp-image-5148" srcset="/wp-content/uploads/2018/05/word-image-4653.png 511w, /wp-content/uploads/2018/05/word-image-4653-150x150.png 150w, /wp-content/uploads/2018/05/word-image-4653-300x298.png 300w" sizes="(max-width: 511px) 100vw, 511px" /><br />
<img loading="lazy" decoding="async" width="473" height="65" src="/wp-content/uploads/2018/05/word-image-4654.png" class="wp-image-5149" srcset="/wp-content/uploads/2018/05/word-image-4654.png 473w, /wp-content/uploads/2018/05/word-image-4654-300x41.png 300w" sizes="(max-width: 473px) 100vw, 473px" /><br />
<img loading="lazy" decoding="async" width="391" height="234" src="/wp-content/uploads/2018/05/word-image-4655.png" class="wp-image-5150" srcset="/wp-content/uploads/2018/05/word-image-4655.png 391w, /wp-content/uploads/2018/05/word-image-4655-300x180.png 300w" sizes="(max-width: 391px) 100vw, 391px" /><br />
<img loading="lazy" decoding="async" width="1021" height="547" src="/wp-content/uploads/2018/05/word-image-4656.png" class="wp-image-5151" srcset="/wp-content/uploads/2018/05/word-image-4656.png 1021w, /wp-content/uploads/2018/05/word-image-4656-300x161.png 300w, /wp-content/uploads/2018/05/word-image-4656-768x411.png 768w" sizes="(max-width: 1021px) 100vw, 1021px" /></p>
<h1>七、数据库的备份和还原</h1>
<h2>1、备份数据库（mongodump）</h2>
<h3>1）语法</h3>
<ul>
<li>
    导出数据语法：mongodump -h __ -port __ -u __ -p __ -d __ -o __
  </li>
<li>
    说明
  </li>
<li>
    -h  	服务器ip地址（默认：127.0.0.1）
  </li>
<li>
    -port  端口号（默认：27017）
  </li>
<li>
    -u     用户名（开启认证模式则必须）
  </li>
<li>
    -p     密码（开启认证模式则必须）
  </li>
<li>
    -d     备份数据库（注：不写则代表全部）
  </li>
<li>
    -o     备份目录
  </li>
</ul>
<h3>练习</h3>
<ul>
<li>
    备份所有数据：mongodump -u admin -p admin888 -o E:\mongodb\bak
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1288" height="391" src="/wp-content/uploads/2018/05/word-image-4657.png" class="wp-image-5152" srcset="/wp-content/uploads/2018/05/word-image-4657.png 1288w, /wp-content/uploads/2018/05/word-image-4657-300x91.png 300w, /wp-content/uploads/2018/05/word-image-4657-768x233.png 768w, /wp-content/uploads/2018/05/word-image-4657-1024x311.png 1024w" sizes="(max-width: 1288px) 100vw, 1288px" /></p>
<ul>
<li>
    备份指定数据：mongodump -u shop1 -p admin888 -d shop -o E:\mongodb\bak2
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1232" height="165" src="/wp-content/uploads/2018/05/word-image-4658.png" class="wp-image-5153" srcset="/wp-content/uploads/2018/05/word-image-4658.png 1232w, /wp-content/uploads/2018/05/word-image-4658-300x40.png 300w, /wp-content/uploads/2018/05/word-image-4658-768x103.png 768w, /wp-content/uploads/2018/05/word-image-4658-1024x137.png 1024w" sizes="(max-width: 1232px) 100vw, 1232px" /></p>
<h2>2、还原数据库（mongorestore）</h2>
<h3>1）语法</h3>
<ul>
<li>
    还原数据语法：mongorestore -h __ -port __ -u __ -p __ -d__ &#8211;drop 原备份数据目录
  </li>
<li>
    说明
  </li>
<li>
    -h  	服务器ip地址（默认：127.0.0.1）
  </li>
<li>
    -port  端口号（默认：27017）
  </li>
<li>
    -u     用户名（开启认证模式则必须）
  </li>
<li>
    -p     密码（开启认证模式则必须）
  </li>
<li>
    -d  database  数据库（不写则还原全部数据库）
  </li>
<li>
    &#8211;drop  先删除所有的记录，然后恢复
  </li>
</ul>
<h3>2）练习</h3>
<ul>
<li>
    还原所有数据：mongorestore -u admin -p admin888 &#8211;drop E:\mongodb\bak
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="409" height="236" src="/wp-content/uploads/2018/05/word-image-4659.png" class="wp-image-5154" srcset="/wp-content/uploads/2018/05/word-image-4659.png 409w, /wp-content/uploads/2018/05/word-image-4659-300x173.png 300w" sizes="(max-width: 409px) 100vw, 409px" /><br />
<img loading="lazy" decoding="async" width="748" height="75" src="/wp-content/uploads/2018/05/word-image-4660.png" class="wp-image-5155" srcset="/wp-content/uploads/2018/05/word-image-4660.png 748w, /wp-content/uploads/2018/05/word-image-4660-300x30.png 300w" sizes="(max-width: 748px) 100vw, 748px" /><br />
<img loading="lazy" decoding="async" width="712" height="262" src="/wp-content/uploads/2018/05/word-image-4661.png" class="wp-image-5156" srcset="/wp-content/uploads/2018/05/word-image-4661.png 712w, /wp-content/uploads/2018/05/word-image-4661-300x110.png 300w" sizes="(max-width: 712px) 100vw, 712px" /></p>
<p>
  切记不要删除admin数据库
</p>
<ul>
<li>
    还原指定数据：mongorestore -u admin -p admin888 -d shop &#8211;drop E:\mongodb\bak2
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="788" height="454" src="/wp-content/uploads/2018/05/word-image-4662.png" class="wp-image-5157" srcset="/wp-content/uploads/2018/05/word-image-4662.png 788w, /wp-content/uploads/2018/05/word-image-4662-300x173.png 300w, /wp-content/uploads/2018/05/word-image-4662-768x442.png 768w" sizes="(max-width: 788px) 100vw, 788px" /><br />
<img loading="lazy" decoding="async" width="1328" height="258" src="/wp-content/uploads/2018/05/word-image-4663.png" class="wp-image-5158" srcset="/wp-content/uploads/2018/05/word-image-4663.png 1328w, /wp-content/uploads/2018/05/word-image-4663-300x58.png 300w, /wp-content/uploads/2018/05/word-image-4663-768x149.png 768w, /wp-content/uploads/2018/05/word-image-4663-1024x199.png 1024w" sizes="(max-width: 1328px) 100vw, 1328px" /><br />
<img loading="lazy" decoding="async" width="676" height="272" src="/wp-content/uploads/2018/05/word-image-4664.png" class="wp-image-5159" srcset="/wp-content/uploads/2018/05/word-image-4664.png 676w, /wp-content/uploads/2018/05/word-image-4664-300x121.png 300w" sizes="(max-width: 676px) 100vw, 676px" /></p>
<h1>八、PHP 操作MongoDB</h1>
<h2>1、开启mongodb扩展</h2>
<h3>1）查看PHP版本信息，选择对应mongodb扩展</h3>
<p><img loading="lazy" decoding="async" width="991" height="686" src="/wp-content/uploads/2018/05/word-image-4665.png" class="wp-image-5160" srcset="/wp-content/uploads/2018/05/word-image-4665.png 991w, /wp-content/uploads/2018/05/word-image-4665-300x208.png 300w, /wp-content/uploads/2018/05/word-image-4665-768x532.png 768w" sizes="(max-width: 991px) 100vw, 991px" /></p>
<h3>2）让PHP支持操作mongo扩展</h3>
<p>
  步骤1：将mongo.dll扩展文件移动到PHP的ext目录中
</p>
<p><img loading="lazy" decoding="async" width="944" height="481" src="/wp-content/uploads/2018/05/word-image-4666.png" class="wp-image-5161" srcset="/wp-content/uploads/2018/05/word-image-4666.png 944w, /wp-content/uploads/2018/05/word-image-4666-300x153.png 300w, /wp-content/uploads/2018/05/word-image-4666-768x391.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<p>
  步骤2：修改php配置文件（php.ini）
</p>
<p><img loading="lazy" decoding="async" width="691" height="306" src="/wp-content/uploads/2018/05/word-image-4667.png" class="wp-image-5162" srcset="/wp-content/uploads/2018/05/word-image-4667.png 691w, /wp-content/uploads/2018/05/word-image-4667-300x133.png 300w" sizes="(max-width: 691px) 100vw, 691px" /></p>
<p>
  步骤3：重启服务
</p>
<h3>3）运行 phpinfo() 查询是否设置成功。</h3>
<p><img loading="lazy" decoding="async" width="1146" height="577" src="/wp-content/uploads/2018/05/word-image-4668.png" class="wp-image-5163" srcset="/wp-content/uploads/2018/05/word-image-4668.png 1146w, /wp-content/uploads/2018/05/word-image-4668-300x151.png 300w, /wp-content/uploads/2018/05/word-image-4668-768x387.png 768w, /wp-content/uploads/2018/05/word-image-4668-1024x516.png 1024w" sizes="(max-width: 1146px) 100vw, 1146px" /></p>
<h2>2、PHP代码</h2>
<h3>1、php添加数据</h3>
<p><img loading="lazy" decoding="async" width="801" height="490" src="/wp-content/uploads/2018/05/word-image-4669.png" class="wp-image-5164" srcset="/wp-content/uploads/2018/05/word-image-4669.png 801w, /wp-content/uploads/2018/05/word-image-4669-300x184.png 300w, /wp-content/uploads/2018/05/word-image-4669-768x470.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建对象
</p>
<p>
  $username = &#8216;admin&#8217;;
</p>
<p>
  $password = &#8216;admin888&#8217;;
</p>
<p>
  $host = &#8216;127.0.0.1&#8217;;
</p>
<p>
  $mongodb = new Mongo(&#8220;mongodb://{$username}:{$password}@{$host}&#8221;);
</p>
<p>
  // var_dump($mongodb);
</p>
<p>
  //MongoDB语法：$对象-&gt;数据库名-&gt;集合名-&gt;增查改删指令();
</p>
<p>
  //多学一招：之前在mongodb窗口输入json数据，先通过php统一改成数据
</p>
<p>
  //增：给php12数据库的test2集合中插入一条数据（name:l4，age:18）
</p>
<p>
  $rs = $mongodb-&gt;php12-&gt;test2-&gt;insert(array(
</p>
<p>
  	&#8216;name&#8217; =&gt; &#8216;l4&#8217;,
</p>
<p>
  	&#8216;age&#8217; =&gt; 18
</p>
<p>
  ));
</p>
<p>
  var_dump($rs);
</p>
<p>
  //&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  发现：开启验证模式后通过PHP操作失败
</p>
<p>
  解决：mongodb3版本存在一个bug，需要将currentVersion改成3，从新添加用户即可
</p>
<p>
  步骤1：关闭并卸载服务
</p>
<p><img loading="lazy" decoding="async" width="834" height="260" src="/wp-content/uploads/2018/05/word-image-4670.png" class="wp-image-5165" srcset="/wp-content/uploads/2018/05/word-image-4670.png 834w, /wp-content/uploads/2018/05/word-image-4670-300x94.png 300w, /wp-content/uploads/2018/05/word-image-4670-768x239.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></p>
<p>
  步骤2：创建服务（注：非验证模式）
</p>
<p>
  mongod &#8211;install &#8211;dbpath=e:\mongodb\data &#8211;logpath=e:\mongodb\log1.txt
</p>
<p><img loading="lazy" decoding="async" width="797" height="178" src="/wp-content/uploads/2018/05/word-image-4671.png" class="wp-image-5166" srcset="/wp-content/uploads/2018/05/word-image-4671.png 797w, /wp-content/uploads/2018/05/word-image-4671-300x67.png 300w, /wp-content/uploads/2018/05/word-image-4671-768x172.png 768w" sizes="(max-width: 797px) 100vw, 797px" /></p>
<p>
  步骤3：登录将currentVersion的数字改成3即可
</p>
<p><img loading="lazy" decoding="async" width="729" height="341" src="/wp-content/uploads/2018/05/word-image-4672.png" class="wp-image-5167" srcset="/wp-content/uploads/2018/05/word-image-4672.png 729w, /wp-content/uploads/2018/05/word-image-4672-300x140.png 300w" sizes="(max-width: 729px) 100vw, 729px" /></p>
<p>
  步骤4：删除admin用户，创新创建
</p>
<p><img loading="lazy" decoding="async" width="760" height="315" src="/wp-content/uploads/2018/05/word-image-4673.png" class="wp-image-5168" srcset="/wp-content/uploads/2018/05/word-image-4673.png 760w, /wp-content/uploads/2018/05/word-image-4673-300x124.png 300w" sizes="(max-width: 760px) 100vw, 760px" /><br />
<img loading="lazy" decoding="async" width="538" height="408" src="/wp-content/uploads/2018/05/word-image-4674.png" class="wp-image-5169" srcset="/wp-content/uploads/2018/05/word-image-4674.png 538w, /wp-content/uploads/2018/05/word-image-4674-300x228.png 300w" sizes="(max-width: 538px) 100vw, 538px" /></p>
<p>
  步骤5：退出、停止服务、并卸载服务
</p>
<p><img loading="lazy" decoding="async" width="885" height="308" src="/wp-content/uploads/2018/05/word-image-4675.png" class="wp-image-5170" srcset="/wp-content/uploads/2018/05/word-image-4675.png 885w, /wp-content/uploads/2018/05/word-image-4675-300x104.png 300w, /wp-content/uploads/2018/05/word-image-4675-768x267.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>
  步骤6：重新创建验证模式即可
</p>
<p>
  mongod &#8211;install &#8211;dbpath=e:\mongodb\data &#8211;logpath=e:\mongodb\log3.txt &#8211;auth
</p>
<p><img loading="lazy" decoding="async" width="893" height="224" src="/wp-content/uploads/2018/05/word-image-4676.png" class="wp-image-5171" srcset="/wp-content/uploads/2018/05/word-image-4676.png 893w, /wp-content/uploads/2018/05/word-image-4676-300x75.png 300w, /wp-content/uploads/2018/05/word-image-4676-768x193.png 768w" sizes="(max-width: 893px) 100vw, 893px" /></p>
<h3>2、php修改数据</h3>
<p><img loading="lazy" decoding="async" width="863" height="477" src="/wp-content/uploads/2018/05/word-image-4677.png" class="wp-image-5172" srcset="/wp-content/uploads/2018/05/word-image-4677.png 863w, /wp-content/uploads/2018/05/word-image-4677-300x166.png 300w, /wp-content/uploads/2018/05/word-image-4677-768x424.png 768w" sizes="(max-width: 863px) 100vw, 863px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建对象
</p>
<p>
  $username = &#8216;admin&#8217;;
</p>
<p>
  $password = &#8216;admin888&#8217;;
</p>
<p>
  $host = &#8216;127.0.0.1&#8217;;
</p>
<p>
  $mongodb = new Mongo(&#8220;mongodb://{$username}:{$password}@{$host}&#8221;);
</p>
<p>
  // var_dump($mongodb);
</p>
<p>
  //MongoDB语法：db.集合名.update（条件， {修改器:{键:值}}）；
</p>
<p>
  //PHP中语法：$对象-&gt;数据库名-&gt;集合名-&gt;改(就是将花括号改成数组即可);
</p>
<p>
  //需求：将php12数据库中的test2集合中的数据name改成 z3即可
</p>
<p>
  $rs = $mongodb-&gt;php12-&gt;test2-&gt;update(
</p>
<p>
  	array(),
</p>
<p>
  	array(&#8216;$set&#8217;=&gt;array(&#8216;name&#8217;=&gt;&#8217;z3&#8217;)),
</p>
<p>
  	<strong>array(&#8216;multiple&#8217; =&gt; true)</strong>
</p>
<p>
  );
</p>
<p>
  var_dump($rs);
</p>
<h3>3、PHP遍历数据</h3>
<p><img loading="lazy" decoding="async" width="890" height="443" src="/wp-content/uploads/2018/05/word-image-4678.png" class="wp-image-5173" srcset="/wp-content/uploads/2018/05/word-image-4678.png 890w, /wp-content/uploads/2018/05/word-image-4678-300x149.png 300w, /wp-content/uploads/2018/05/word-image-4678-768x382.png 768w" sizes="(max-width: 890px) 100vw, 890px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建对象
</p>
<p>
  $username = &#8216;admin&#8217;;
</p>
<p>
  $password = &#8216;admin888&#8217;;
</p>
<p>
  $host = &#8216;127.0.0.1&#8217;;
</p>
<p>
  $mongodb = new Mongo(&#8220;mongodb://{$username}:{$password}@{$host}&#8221;);
</p>
<p>
  // $rs = $mongodb-&gt;php12-&gt;test2-&gt;findOne();
</p>
<p>
  // echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  // print_r($rs);
</p>
<p>
  echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  $rs = $mongodb-&gt;php12-&gt;test2-&gt;find();
</p>
<p>
  foreach ($rs as $data) {
</p>
<p>
  	print_r($data);
</p>
<p>
  }</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/5082.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
