7wu1wm0 发表于 2024-7-27 01:08:07

Mysql平常的优化策略有哪些呢?


    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz/QibLP1rpwH8sYPCicktMM1yia3vo4v3k9ssiaEZXbTu2fkQicEHe46BdZuW7icruIo9j4QExzqe5rude9MkwF2OCdRdA/640?wx_fmt=gif&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;"><span style="color: black;">文案</span>来自于</strong><span style="color: black;"><span style="color: black;">:<strong style="color: blue;">博客</strong></span></span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">链接:https://www.cnblogs.com/zhenbianshu/p/5002189.html</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">商务合作的请加<span style="color: black;">微X</span>(QQ):2230304070</strong></p><img src="https://mmbiz.qpic.cn/mmbiz_gif/Ljib4So7yuWiaXZ8ohFKcUoLAQ3NFe9Jsvts7oPTmU0pbkvMQQiawmN8CwQBVicXHHHlNhwOvOpydRr03yYVdiasL7A/640?wx_fmt=gif&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1" style="width: 50%; margin-bottom: 20px;"><img src="https://mmbiz.qpic.cn/mmbiz/Ljib4So7yuWiaUgaOKyL1omvthBnoVVcgdVj13w0amkZo2J3Jt2iaZSVlvdhs3Mm5VLf9QXF6G9aMwquTIFEmWB9g/640?wx_fmt=other&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;">
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><strong style="color: blue;">分享教程</strong></span></p><img src="https://mmbiz.qpic.cn/mmbiz/Ljib4So7yuWiaUgaOKyL1omvthBnoVVcgdODicCv2LyvflVtrficLNXMEDRcaTvuia3nncwxyPpZO5dFcf5A2KfSC7w/640?wx_fmt=other&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;">
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><strong style="color: blue;"><span style="color: black;">链接放在公众号里是最好的,过期了就<span style="color: black;">能够</span>修改,<span style="color: black;">因此</span>这<span style="color: black;">便是</span>不放在<span style="color: black;">文案</span>里的<span style="color: black;">原由</span>,</span></strong></span><strong style="color: blue;"><span style="color: black;">请看清楚这段话好吗:</span></strong><span style="color: black;"><strong style="color: blue;"><span style="color: black;">有需要的<span style="color: black;">能够</span>关注“PHP自学中心”,回复对应的关键词,获取链接与提取码。</span></strong></span><span style="color: black;"><strong style="color: blue;"><span style="color: black;">感谢<span style="color: black;">大众</span>的支持与信任</span></strong></span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">CodeIgniter3视频教程</p>链接<span style="color: black;">:https://pan</span>.baidu.com/s/<span style="color: black;">1</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">kU6fbKz&nbsp;</p><span style="color: black;">秘码</span><span style="color: black;">:</span>本公众号里回复关键词:<span style="color: black;"><strong style="color: blue;">CI3</strong></span><img src="https://mmbiz.qpic.cn/mmbiz/Ljib4So7yuWiaUgaOKyL1omvthBnoVVcgdVj13w0amkZo2J3Jt2iaZSVlvdhs3Mm5VLf9QXF6G9aMwquTIFEmWB9g/640?wx_fmt=other&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;">
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><strong style="color: blue;"><span style="color: black;">文案</span>正文</strong></span></p><img src="https://mmbiz.qpic.cn/mmbiz/Ljib4So7yuWiaUgaOKyL1omvthBnoVVcgdODicCv2LyvflVtrficLNXMEDRcaTvuia3nncwxyPpZO5dFcf5A2KfSC7w/640?wx_fmt=other&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;">
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">PHP的瓶颈<span style="color: black;">非常多</span><span style="color: black;">状况</span>下不在PHP<span style="color: black;">自己</span>,而在于数据库。<span style="color: black;">咱们</span>都<span style="color: black;">晓得</span>,PHP<span style="color: black;">研发</span>中,数据的增删改查是核心。为了<span style="color: black;">提高</span>PHP的运行效率,程序员<span style="color: black;">不但</span>需要写出<span style="color: black;">规律</span>清晰,效率很高的代码,还要能对query语句进行优化。虽然<span style="color: black;">咱们</span>对数据库的读取写入速度上却是无能为力,但在<span style="color: black;">有些</span>数据库类扩展像memcache、mongodb、redis<span style="color: black;">这般</span>的数据存储服务器的<span style="color: black;">帮忙</span>下,PHP<span style="color: black;">亦</span>能达到更快的存取速度,<span style="color: black;">因此</span><span style="color: black;">认识</span>学习这些扩展<span style="color: black;">亦</span>是非常必要,这一篇先说一下MySQL<span style="color: black;">平常</span>的优化策略。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">大型存储方面优化</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;"><span style="color: black;">数据库主从复制和读写分离</span></strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">1、master将改变记录到二进制日志中,slave将master的二进制拷贝到它的中继日志中,重新将数据返回到它自己的数据中,达到复制主服务器数据的目的。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">主从复制<span style="color: black;">能够</span>用作:数据库负载<span style="color: black;">平衡</span>、数据库备份、读写分离等功能。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2、配置主服务器master</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  修改my.ini/my.conf</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  </p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  log-bin=mysql-bin //启用二进制日志</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  server-id=102 //服务器<span style="color: black;">独一</span>ID</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">3、配置从服务器slave</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  log-bin=mysql-bin //启用二进制日志</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">server-id=226 //服务器<span style="color: black;">独一</span>ID</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">4、在主服务器上授权从服务器</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">GRANT REPLICATION SLAVE ON *.* to slavename@IP identified by root</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">5、在从服务器上<span style="color: black;">运用</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  change master to&nbsp;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  master_host="masterip",</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">master_user="masteruser",</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  master_password="masterpasswd";</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">6、<span style="color: black;">而后</span><span style="color: black;">运用</span>start slave命令<span style="color: black;">起始</span>进行主从复制。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">不要忘记在每次修改配置后重启服务器,<span style="color: black;">而后</span><span style="color: black;">能够</span>在主从服务器上用show master/slave status查看主/从状态。</p>实现数据库的读写分离要依赖MySQL的中间件,如mysql_proxy,atlas等。<span style="color: black;">经过</span>配置这些中间件来对主从服务器进行读写分离,使从服务器承担被读取的责任,从而减轻主服务器的<span style="color: black;">包袱</span>。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;"><span style="color: black;">数据库的sharding</span></strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在数据库中数据表中的数据量非常庞大的时候,无论是索引还是缓存等压力都很大,对数据库进行sharding,使之分别以多个数据库服务器或多个表存储,以减轻<span style="color: black;">查找</span>压力。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">方式有垂直切分、水平切分和联合切分。</p>
    <span style="color: black;">垂直切分</span><span style="color: black;">
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">:在数据表非常多的时候,把数据库中关系紧密(如同一模块,经常连接<span style="color: black;">查找</span>)的表切分出来分别放到<span style="color: black;">区别</span>的主从server上。</p>
    </span><span style="color: black;">水平切分:</span><span style="color: black;">
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在表不多,而表里的数据量非常大的时候,为了加快<span style="color: black;">查找</span>,<span style="color: black;">能够</span>用哈希等算法,将一个数据表分为几个,分别放到<span style="color: black;">区别</span>的服务器上,加快<span style="color: black;">查找</span>。水平切分和数据表分区的区别在于其存储介质上的<span style="color: black;">区别</span>。</p>
    </span><span style="color: black;">联合切分:</span><span style="color: black;">
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">更加多</span>的<span style="color: black;">状况</span>是数据表和表中的数据量都非常大,则要进行联合切分,即<span style="color: black;">同期</span>进行垂直和水平分表,将数据库切分为一个分布式的矩阵来存储。</p>这些数据库的优化方式,每一种拿出来都<span style="color: black;">能够</span>写作一篇<span style="color: black;">文案</span>,可谓是博大精深,<span style="color: black;">认识</span>并记忆了这些方式,<span style="color: black;">能够</span>在有需要的时候进行有目的的<span style="color: black;">选取</span>优化,达到数据库效率的<span style="color: black;">有效</span>。
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">索引方面优化</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">在MySQL中,索引属于存储引擎级别的概念,<span style="color: black;">区别</span>存储引擎对索引的实现方式是<span style="color: black;">区别</span>的,下面<span style="color: black;">重点</span>讨论MyISAM和InnoDB两个存储引擎的索引实现方式。</span></p>
    <h2 style="color: black; text-align: left; margin-bottom: 10px;"><strong style="color: blue;"><span style="color: black;">MyISAM索引实现</span></strong></h2>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">MyISAM引擎<span style="color: black;">运用</span>B+Tree<span style="color: black;">做为</span>索引结构,叶节点的data域存放的是数据记录的<span style="color: black;">位置</span>。下图是MyISAM索引的原理图</span><span style="color: black;">:</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/QibLP1rpwH8siaYaY17AibBiaYoottMiaGicBLcBhaCW4icPQw1FSWHNPIJsPJHdOCQVYib94nYylia20N3S2jrD6Gibgmtw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">图1</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">这儿</span>设表一共有三列,假设<span style="color: black;">咱们</span>以Col1为主键,则图1是一个MyISAM表的主索引(Primary key)示意。<span style="color: black;">能够</span>看出MyISAM的索引文件仅仅<span style="color: black;">保留</span>数据记录的<span style="color: black;">位置</span>。在MyISAM中,主索引和辅助索引(Secondary key)在结构上<span style="color: black;">无</span>任何区别,只是主索引<span style="color: black;">需求</span>key是<span style="color: black;">独一</span>的,而辅助索引的key<span style="color: black;">能够</span>重复。<span style="color: black;">倘若</span><span style="color: black;">咱们</span>在Col2上<span style="color: black;">创立</span>一个辅助索引,则此索引的结构如下图所示:</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/QibLP1rpwH8siaYaY17AibBiaYoottMiaGicBLNH1wH8SG022icEQxBMHqTADmQIa86xJa5LKgF9zxN3EQ2C2QtRYdyBg/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">图2&nbsp;</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">一样</span><span style="color: black;">亦</span>是一颗B+Tree,data域<span style="color: black;">保留</span>数据记录的<span style="color: black;">位置</span>。<span style="color: black;">因此呢</span>,MyISAM中索引检索的算法为<span style="color: black;">首要</span><span style="color: black;">根据</span>B+Tree搜索算法搜索索引,<span style="color: black;">倘若</span>指定的Key存在,则取出其data域的值,<span style="color: black;">而后</span>以data域的值为<span style="color: black;">位置</span>,读取相应数据记录。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">MyISAM的索引方式<span style="color: black;">亦</span>叫做“非聚集”的,之<span style="color: black;">因此</span>这么<span style="color: black;">叫作</span>呼是为了与InnoDB的聚集索引区分。</span></p>
    <h2 style="color: black; text-align: left; margin-bottom: 10px;"><span style="color: black;"><strong style="color: blue;"><span style="color: black;">InnoDB索引实现</span></strong></span></h2>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">虽然InnoDB<span style="color: black;">亦</span><span style="color: black;">运用</span>B+Tree<span style="color: black;">做为</span>索引结构,但<span style="color: black;">详细</span>实现方式却与MyISAM截然<span style="color: black;">区别</span>。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">第1</span>个重大区别是InnoDB的数据文件本身<span style="color: black;">便是</span>索引文件。从上文<span style="color: black;">晓得</span>,MyISAM索引文件和数据文件是分离的,索引文件仅<span style="color: black;">保留</span>数据记录的<span style="color: black;">位置</span>。而在InnoDB中,表数据文件本身<span style="color: black;">便是</span>按B+Tree组织的一个索引结构,这棵树的叶节点data域<span style="color: black;">保留</span>了完整的数据记录。这个索引的key是数据表的主键,<span style="color: black;">因此呢</span>InnoDB表数据文件本身<span style="color: black;">便是</span>主索引。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/QibLP1rpwH8siaYaY17AibBiaYoottMiaGicBLK1E0zOf99TVc5yO4qElOPWhfbbwZcXplBGppPa1qHQvHL4eibl2F7icQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">图3</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">图3是InnoDB主索引(<span style="color: black;">同期</span><span style="color: black;">亦</span>是数据文件)的示意图,<span style="color: black;">能够</span>看到叶节点<span style="color: black;">包括</span>了完整的数据记录。这种索引叫做聚集索引。<span style="color: black;">由于</span>InnoDB的数据文件本身要按主键聚集,<span style="color: black;">因此</span>InnoDB<span style="color: black;">需求</span>表必须有主键(MyISAM<span style="color: black;">能够</span><span style="color: black;">无</span>),<span style="color: black;">倘若</span><span style="color: black;">无</span>显式指定,则MySQL系统会自动<span style="color: black;">选取</span>一个<span style="color: black;">能够</span><span style="color: black;">独一</span>标识数据记录的列<span style="color: black;">做为</span>主键,<span style="color: black;">倘若</span>不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段<span style="color: black;">做为</span>主键,这个字段长度为6个字节,类型为长整形。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">第二个与MyISAM索引的<span style="color: black;">区别</span>是InnoDB的辅助索引data域存储相应记录主键的值而不是<span style="color: black;">位置</span>。换句话说,InnoDB的所有辅助索引都引用主键<span style="color: black;">做为</span>data域。例如,图4为定义在Col3上的一个辅助索引:</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/QibLP1rpwH8siaYaY17AibBiaYoottMiaGicBLNUfOxDba7nxC4JfvmtN7L8D9ibgqsjZMAredibmAPgxdBlYJ9y5VQvqQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">图4</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">这儿</span>以英文字符的ASCII码<span style="color: black;">做为</span>比较准则。聚集索引这种实现方式使得按主键的搜索<span style="color: black;">非常</span><span style="color: black;">有效</span>,<span style="color: black;">然则</span>辅助索引搜索需要检索两遍索引:<span style="color: black;">首要</span>检索辅助索引<span style="color: black;">得到</span>主键,<span style="color: black;">而后</span>用主键到主索引中检索<span style="color: black;">得到</span>记录。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">认识</span><span style="color: black;">区别</span>存储引擎的索引实现方式<span style="color: black;">针对</span>正确<span style="color: black;">运用</span>和优化索引都非常有<span style="color: black;">帮忙</span>,例如<span style="color: black;">晓得</span>了InnoDB的索引实现后,就很容易明白<span style="color: black;">为何</span>不<span style="color: black;">意见</span><span style="color: black;">运用</span>过长的字段<span style="color: black;">做为</span>主键,<span style="color: black;">由于</span>所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段<span style="color: black;">做为</span>主键在InnoDB中不是个好主意,<span style="color: black;">由于</span>InnoDB数据文件本身是一颗B+Tree,非单调的主键会<span style="color: black;">导致</span>在<span style="color: black;">插进</span>新记录时数据文件为了维持B+Tree的特性而频繁的分裂<span style="color: black;">调节</span>,<span style="color: black;">非常</span>低效,而<span style="color: black;">运用</span>自增字段<span style="color: black;">做为</span>主键则是一个很好的<span style="color: black;">选取</span>。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">数据<span style="color: black;">查找</span>方面优化</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">在每一个消耗<span style="color: black;">海量</span>时间的<span style="color: black;">查找</span>案例中,都能看到<span style="color: black;">有些</span>不必要的额外操作、某些操作被额<span style="color: black;">外区</span>重复了<span style="color: black;">非常多</span>次、某些操作执行得太慢等。优化<span style="color: black;">查找</span>的目的<span style="color: black;">便是</span>减少和消除这些操作所花费的时间。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">1、</span>首选要优化数据<span style="color: black;">拜访</span></span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">查找</span>性能底下最基本的<span style="color: black;">原由</span>是<span style="color: black;">拜访</span>的数据太多。<span style="color: black;">因此</span>,<span style="color: black;">针对</span>低效的<span style="color: black;">查找</span>,<span style="color: black;">通常</span><span style="color: black;">经过</span>两个<span style="color: black;">过程</span>来分析:</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">确认应用程序<span style="color: black;">是不是</span>在检索<span style="color: black;">海量</span>超过需要的数据。这<span style="color: black;">一般</span><span style="color: black;">寓意</span>着<span style="color: black;">拜访</span>了太多的行,但有时候<span style="color: black;">亦</span>可能是<span style="color: black;">拜访</span>了太多的列。确认MySQL服务器层<span style="color: black;">是不是</span>在分析<span style="color: black;">海量</span>超过需要的数据行。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">1.1、<span style="color: black;">是不是</span>向数据库请求了不需要的数据</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">在<span style="color: black;">拜访</span>数据库时,应该只请求需要的行和列,请求多余的行和列会消耗MySQL服务器的CPU和内存资源,并<span style="color: black;">增多</span>网络开销。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">1、在处理分页时,应该<span style="color: black;">运用</span>LIMIT限制MySQL只返回需要的数据,而不是向应用程序返回<span style="color: black;">所有</span>数据后,再由应用程序过滤不需要的行。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">2、多表<span style="color: black;">相关</span>时,或获取单表数据时,<span style="color: black;">尽可能</span>避免不加思考地<span style="color: black;">运用</span>SELECT *</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">3、当<span style="color: black;">有些</span>数据被多次<span style="color: black;">运用</span>时<span style="color: black;">能够</span><span style="color: black;">思虑</span>将数据缓存起来,避免每次<span style="color: black;">运用</span>都要到MySQL<span style="color: black;">查找</span>。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">1.2、MySQL<span style="color: black;">是不是</span>在扫描额外的记录,应该让MySQL<span style="color: black;">运用</span>最合适的方式<span style="color: black;">查找</span>数据</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">针对</span>MySQL,最简单的衡量<span style="color: black;">查找</span>开销有三个指标:响应时间、扫描的行数和返回的行数。<span style="color: black;">这儿</span><span style="color: black;">重点</span><span style="color: black;">思虑</span><span style="color: black;">加强</span>扫描的方式,即<span style="color: black;">查找</span>数据的方式。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">查找</span>数据的方式有全表扫描、索引扫描、范围扫描、唯一索引<span style="color: black;">查找</span>、常数引用等。这些<span style="color: black;">查找</span>方式,速度从慢到快,扫描的行数<span style="color: black;">亦</span>是从多到少。<span style="color: black;">能够</span><span style="color: black;">经过</span>EXPLAIN语句中的type列反应<span style="color: black;">查找</span>采用的是哪种方式。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">一般</span><span style="color: black;">能够</span><span style="color: black;">经过</span>添加合适的索引改善<span style="color: black;">查找</span>数据的方式,使其尽可能减少扫描的数据行,加快<span style="color: black;">查找</span>速度。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">例如,当<span style="color: black;">发掘</span><span style="color: black;">查找</span>需要扫描<span style="color: black;">海量</span>的数据行但只返回<span style="color: black;">少许</span>的行,<span style="color: black;">那样</span><span style="color: black;">能够</span><span style="color: black;">思虑</span><span style="color: black;">运用</span>覆盖索引,即把所有需要用到的列都放到索引中。<span style="color: black;">这般</span>存储引擎无须回表获取对应行就<span style="color: black;">能够</span>返回结果了。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">2、</span>重构<span style="color: black;">查找</span>的<span style="color: black;">办法</span></span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">设计<span style="color: black;">查找</span>的时候需要<span style="color: black;">思虑</span><span style="color: black;">是不是</span>需要把一个<span style="color: black;">繁杂</span>的<span style="color: black;">查找</span>分成多个简单的<span style="color: black;">查找</span>。在我的印象中,曾经无数次听到一个经验法则:<span style="color: black;">能够</span>在数据库中做的事不要放在应用程序中,数据库比<span style="color: black;">咱们</span>想象的要厉害的多。这个经验法则是在华夏基金<span style="color: black;">运用</span>Oracle编写SQL时一位Oracle牛人告诉我的,后来我把它<span style="color: black;">运用</span>到MySQL上,真是吃尽苦头。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">当然这其中的<span style="color: black;">原由</span>有Oracle和MySQL<span style="color: black;">本来</span>就不是<span style="color: black;">同样</span>的处理<span style="color: black;">规律</span>,并且<span style="color: black;">此刻</span>的网络通信、<span style="color: black;">查找</span>解析和优化的代价并<span style="color: black;">无</span>以前<span style="color: black;">那样</span>高啦。再次说明,经验法则有在某种特定笼子里才有效。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">分解<span style="color: black;">繁杂</span>的<span style="color: black;">查找</span>:</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">能够</span>将一个大<span style="color: black;">查找</span>切分成多个小<span style="color: black;">查找</span>执行,<span style="color: black;">每一个</span>小<span style="color: black;">查找</span>只完成<span style="color: black;">全部</span><span style="color: black;">查找</span>任务的一小部分,每次只返回一小部分结果。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">删除旧的数据是一个很好的例子。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">倘若</span>只用一条语句一次性执行一个大的删除操作,则可能需要一次锁住<span style="color: black;">非常多</span>数据,占满<span style="color: black;">全部</span>事务日志,耗尽系统资源、阻塞<span style="color: black;">非常多</span>小的但重要的<span style="color: black;">查找</span>。将一个大的删除操作分解成多个较小的删除操作<span style="color: black;">能够</span>将服务器上<span style="color: black;">本来</span>一次性的压力分散到多次操作上,尽可能小地影响MySQL性能,减少删除时锁的等待时间,<span style="color: black;">同期</span><span style="color: black;">亦</span>减少了MySQL主从复制的延迟。这个<span style="color: black;">办法</span>我<span style="color: black;">始终</span>在用。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">另一个例子是分解<span style="color: black;">相关</span><span style="color: black;">查找</span>,即对<span style="color: black;">每一个</span>要<span style="color: black;">相关</span>的表进行单表<span style="color: black;">查找</span>,<span style="color: black;">而后</span>将结果在应用程序中进行<span style="color: black;">相关</span>。我在之前一家<span style="color: black;">机构</span>和一位在阿里待过<span style="color: black;">非常多</span>年的同事<span style="color: black;">一块</span>编码时,他<span style="color: black;">便是</span>这么干的。后来我在心中默默地鄙视着他,<span style="color: black;">由于</span>我心里有这么一个经验法则(<span style="color: black;">能够</span>在数据库中做的事不要放在应用程序中,数据库比<span style="color: black;">咱们</span>想象的要厉害的多),并且我在行动上<span style="color: black;">亦</span>是保持能用一个SQL<span style="color: black;">处理</span>的事绝对不会用两个SQL。这么做当然处理经验法则的<span style="color: black;">原由</span>之外还有一个<span style="color: black;">原由</span>是:获取数据的<span style="color: black;">规律</span><span style="color: black;">尽可能</span>与业务代码分离,<span style="color: black;">这般</span>以后在切换数据库时<span style="color: black;">亦</span>很方便。<span style="color: black;">实质</span>上是<span style="color: black;">这般</span>吗?未必啊。那次的无知让我吃尽苦头啊,后来<span style="color: black;">由于</span>SQL的性能问题再把我写的大部分SQL进行分解。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;"><span style="color: black;">用分解<span style="color: black;">相关</span><span style="color: black;">查找</span>的方式重构<span style="color: black;">查找</span>有如下的<span style="color: black;">优良</span>:</span></strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">让缓存的效率更高。许多应用程序<span style="color: black;">能够</span>方便地缓存单表<span style="color: black;">查找</span>对应的结果对象。将<span style="color: black;">查找</span>分解后,执行单个<span style="color: black;">查找</span><span style="color: black;">能够</span>减少锁的竞争。在应用层做<span style="color: black;">相关</span>,<span style="color: black;">能够</span><span style="color: black;">更易</span>对数据库进行拆分,<span style="color: black;">更易</span>做到高性能和可扩展。<span style="color: black;">查找</span>本身效率<span style="color: black;">亦</span>可能会有所<span style="color: black;">提高</span>。<span style="color: black;">能够</span>减少冗余记录的<span style="color: black;">查找</span>。在应用层做<span style="color: black;">相关</span><span style="color: black;">查找</span>,<span style="color: black;">寓意</span>着<span style="color: black;">针对</span>某条记录应用只需要<span style="color: black;">查找</span>一次,而在数据库中做<span style="color: black;">相关</span><span style="color: black;">查找</span>,则可能需要重复地<span style="color: black;">拜访</span>一部分数据。从这点看,<span style="color: black;">这般</span>的重构还可能会减少网络和内存的消耗。更进一步,<span style="color: black;">这般</span>做相当于在应用中实现了哈希<span style="color: black;">相关</span>,而不是<span style="color: black;">运用</span>MySQL的嵌套循环<span style="color: black;">相关</span>。某些场景哈希<span style="color: black;">相关</span>的效率要高<span style="color: black;">非常多</span>。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">数据库设计方面优化</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">1、数据库设计符合第三范式,为了<span style="color: black;">查找</span>方便<span style="color: black;">能够</span>有<span style="color: black;">必定</span>的数据冗余。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2、<span style="color: black;">选取</span>数据类型优先级 int &gt; date,time &gt; enum,char&gt;varchar &gt; blob,<span style="color: black;">选取</span>数据类型时,<span style="color: black;">能够</span><span style="color: black;">思虑</span>替换,如ip<span style="color: black;">位置</span><span style="color: black;">能够</span>用ip2long()函数转换为unsign int型来进行存储。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">3、<span style="color: black;">针对</span>char(n)类型,在数据完整的<span style="color: black;">状况</span>下<span style="color: black;">尽可能</span>较小的的n值。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">4、在建表时用partition命令对单个表分区<span style="color: black;">能够</span>大大<span style="color: black;">提高</span><span style="color: black;">查找</span>效率,MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用,分区方式为:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  CREATE TABLE tablename{</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  }ENGINE innodb/myisam CHARSET utf8 //<span style="color: black;">选取</span>数据库引擎和编码</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  PARTITION BY RANGE/LIST(column),//按范围和预定义列表进行分区</p>PARTITION partname VALUES LESS THAN /IN(n),//命名分区并<span style="color: black;">仔细</span>限定分区的范围
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">5、<span style="color: black;">选取</span>数据库引擎时要<span style="color: black;">重视</span>innodb 和 myisam的区别。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  存储结构:MyISAM在磁盘上存储成三个文件。而InnoDB所有的表都<span style="color: black;">保留</span>在同一个数据文件中,<span style="color: black;">通常</span>为2GB</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">事务支持:MyISAM不<span style="color: black;">供给</span>事务支持。InnoDB<span style="color: black;">供给</span>事务支持事务。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  表锁差异:MyISAM只支持表级锁。InnoDB支持事务和行级锁。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">  全文索引:MyISAM支持 FULLTEXT类型的全文索引(不适用中文,<span style="color: black;">因此</span>要用sphinx全文索引引擎)。InnoDB不支持。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">表的<span style="color: black;">详细</span>行数:MyISAM<span style="color: black;">保留</span>有表的总行数,<span style="color: black;">查找</span>count(*)<span style="color: black;">火速</span>。InnoDB没有<span style="color: black;">保留</span>表的总行数,需要重新计算。</p>  外键:MyISAM不支持。InnoDB支持

    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">几条MySQL小技巧</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">1、SQL语句中的关键词最好用大写来书写,<span style="color: black;">第1</span>易于区分关键词和操作对象,第二,SQL语句在执行时,MySQL会将其转换为大写,手动写大写能<span style="color: black;">增多</span><span style="color: black;">查找</span>效率(虽然很小)。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">2、<span style="color: black;">倘若</span><span style="color: black;">咱们</span>们经对数据库中的数据行进行增删,<span style="color: black;">那样</span>会<span style="color: black;">显现</span>数据ID过大的<span style="color: black;">状况</span>,用ALTER TABLE tablename AUTO_INCREMENT=N,使自增ID从N<span style="color: black;">起始</span>计数。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">3、对int类型添加&nbsp;ZEROFILL&nbsp;属性<span style="color: black;">能够</span>对数据进行自动补0</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">4、导入<span style="color: black;">海量</span>数据时最好先删除索引再<span style="color: black;">插进</span>数据,再加入索引,<span style="color: black;">否则</span>,mysql会花费<span style="color: black;">海量</span>时间在更新索引上。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">5、创建数据库书写sql语句时 ,<span style="color: black;">咱们</span><span style="color: black;">能够</span>在IDE里创建一个后缀为.sql的文件,IDE会识别sql语法,更易于书写。更重要的是,<span style="color: black;">倘若</span>你的数据库丢失了,你还<span style="color: black;">能够</span>找到这个文件,在当前目录下<span style="color: black;">运用</span>/path/mysql -uusername -ppassword databasename &lt; filename.sql来执行<span style="color: black;">全部</span>文件的sql语句(<span style="color: black;">重视</span>-u和-p后紧跟用户名<span style="color: black;">秘码</span>,无空格)。</span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/QibLP1rpwH8vHKxtwWa4OvcRokaI59t5iafxIETYWJ05EWuAqicFEY6eehsjk9LppAf1bn11EXuJDUCtRJKqbY6ng/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>




m5k1umn 发表于 2024-10-22 07:06:36

“NB”(牛×的缩写,表示叹为观止)‌

1fy07h 发表于 昨天 15:22

外链发布社区 http://www.fok120.com/
页: [1]
查看完整版本: Mysql平常的优化策略有哪些呢?