一、索引的使用

(1)查询要使用索引最重要的条件是查询条件中的字段建立了索引;

(2)下列几种情况可能使用到索引:

  <1> 对于创建的多列索引,只要查询条件使用了最坐边的列,索引一般就会被使用;

  <2> 对于使用 like 的查询,查询如果是 “%aaa” 则不会使用到索引;如果是“aaa%”,则会使用到索引;

(3)下列的表将不会使用索引:

  <1> 如果条件中有 OR,即使其中有条件的列建立了索引,也不会被使用;换而言之,就是所有使用的字段都要建立索引;尽量避免使用OR,效率比较低;

  <2> 对于多列索引,不是使用的第一部分,则不会使用索引;

  <3> like 查询以 “%” 开头;

  <4> 如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引;也就是列是字符串类型,就一定要

  <5> 如果 MySql 估计使用全表扫描要比使用索引快,则不使用索引;

(4)查看索引的使用情况

  Show status like 'Handler_read%‘

  Handler_read_key:这个值越高越好,表示使用索引查询使用的次数;

  Handler_read_rnd_next:这个值越高,说明查询越低效;

(5)大批量插入数据(了解)

  <1> 对于MyISAM:

    alter table table_name disable keys;  关闭表的索引;如果在导入数据的时候不关闭就会一直在建立索引文件,使导入时间过长;导入完成之后再开启表的索引就好了;

    alter table table_name enable keys;  开启表的索引

  <2> 对于 Innodb:

    将导入的数据按照主键排序;

    set unique_checks = 0,关闭唯一性校验,否则每条数据都会检查;

    set autocommit = 0,关闭自动提交;

(6)SQL语句优化的技巧

  <1> 优化 Group by 语句

    MySql 对所有的 group by col1, col2 进行分组查询时,默认分组之后,然后进行排序,可能会降低查询速度;

    如果在查询中使用 group by ,但是用户想要避免排序造成的消耗,可以使用 order by null 来禁止排序;

    即:select * from user group by age order by null;

  <2> 有些情况下,可以使用连接来代替子查询。因为使用 join ,MySql不需要再内存中创建临时表。

    select * from dept,employ where dept.deptno = employ.deptno; [简单方式]

    select * from dept left join employ on dept.deptno = employ.deptno;  [左连外接,更好]

二、存储引擎的选择

1、如何选择 mysql 的存储引擎?

MyISAM:如果对表的事务要求不高,同时是以查询和添加为主,我们考虑使用这种;比如BBS的发帖表、回复表等;

InnoDB:对事务的要求高,保存的数据都是重要数据,建议使用该存储引擎;比如订单表、账号表;

Memory:数据变化频繁,不需要入库,同时频繁的查询和修改,建议使用该存储引擎;

MyISAM的插入速度为什么高于 InnoDB?

答:MyISAM插入的时候放在表的最后,InnoDB 插入的时候会做一个适当的排序;MyISAM 不支持事务,InnoDB支持事务;

【注意】如果使用了 MyISANA 存储引擎,如果经常做删除 或 修改表的记录,要定时执行 optimize table table_name 对表进行碎片整理;否则,有可能出现删除的数据没有删掉等情况。

2、MyISAM 和 InnoDB 的区别?

(1)事务:MyISAM 不支持,InnoDB 支持;

(2)查询添加速度:MyISAM 速度快(插入时直接放在表的最后),InnoDB 速度低(插入时会做事务的校验,适当的排序);

(3)支持全文索引:MyISAM 支持,InnoDB 不支持;

(4)锁机制:MyISAM 表锁,InnoDB 行锁;

(5)外键:MyISAM 不支持外键,InnoDB支持;

3、MySQL 的配置文件

max_connections = 1000 ,一般情况设置为1000,极限是2000左右;

三、读写分离

https://www.cnblogs.com/lin3615/p/5684891.html

1 程序修改mysql操作类
可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求。
优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配
缺点:自己维护更新,增减服务器在代码处理

2 amoeba
参考官网:http://amoeba.meidusa.com/
优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案
缺点:自己分配账户,和后端数据库权限管理独立,权限处理不够灵活

3 mysql-proxy
参考 mysql-proxy
优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号
缺点:字符集问题,lua语言编程,还只是alpha版本,时间消耗有点高

如果你不能安装软件来解决读写分离,那可以尝试阿权的项目解决思路。
如果你可以安装软件,那amoeba是不错的,mysql-proxy不太建议,目前只有alpha版本,效率还不太理想,amoeba目前在阿里巴巴是内部项目,正在生产环境使用的。

MySQL优化(二) 优化诀窍的更多相关文章

  1. MySQL优化二(连接优化和缓存优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  2. mysql优化二之锁机制

    mysql优化二之锁机制 mysql提供了锁机制和MVCC机制来保证并发操作的安全性,这里主要讨论锁机制, MVCC见下篇文章 mysql的锁按照锁粒度可分为行锁与表锁,按照操作类型划分可读锁和写锁 ...

  3. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

  4. MySQL性能优化(二):优化数据库的设计

    原文:MySQL性能优化(二):优化数据库的设计 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.n ...

  5. MySQL优化二 缓存参数优化

    数据库属于 IO密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数 ...

  6. MySQL查询性能优化---高性能(二)

    转载地址:https://segmentfault.com/a/1190000011330649 避免向数据库请求不需要的数据 在访问数据库时,应该只请求需要的行和列.请求多余的行和列会消耗MySql ...

  7. MySQL优化(二):SQL优化

    一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...

  8. 1229【MySQL】性能优化之 Index Condition Pushdown

    转自http://blog.itpub.net/22664653/viewspace-1210844/  [MySQL]性能优化之 Index Condition Pushdown2014-07-06 ...

  9. mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.

    一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...

  10. 理解MySQL——索引与优化

    转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...

随机推荐

  1. bzoj 1814 Ural 1519 Formula 1 ——插头DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...

  2. angular的异步处理$q的使用(promise)

    Angular中的promise: Promise是一种异步方式处理值的方法.代表了一个函数最 终可能的返回值或者抛出的异常 在之前,通常都是使用闭包或者回调来响应非同步的有意义数据 使用promis ...

  3. linux nodejs

    scp node-v8.15.0-linux-x64.tar.gz root@10.88.248.231:/lngoa tar -zxvf node-v8.15.0-linux-x64.tar.gz ...

  4. js跳转 -- 转

    第一种: 复制代码代码如下: <script language="javascript" type="text/javascript"> windo ...

  5. Hadoop-HBASE 热添加新节点

    Hadoop-HBASE 热添加新节点 环境:192.168.137.101 hd1192.168.137.102 hd2192.168.137.103 hd3192.168.137.104 hd4四 ...

  6. 黄聪:谷歌验证 (Google Authenticator) 的实现原理是什么?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:徐小花链接:http://www.zhihu.com/question/20462696/answer/18731073来源: ...

  7. json 数据在textarea中显示的时候,切换 beauty和ugly模式

    转化为beauty模式 var jsonText = $('#json').val(); $('#json').val(JSON.stringify(JSON.parse(jsonText), nul ...

  8. solr6.4.1搜索引擎(4)tomcat重启后数据加载缓慢或丢失

    解决tomcat重启后数据加载缓慢或丢失 我们在首次全量导入和第二次增量导入数据都成功后,在研究solr过程中,会反复重启tomcat. 我们会发现在重启tomcat后,core的data目录下明明已 ...

  9. HTML的day1 HTML的标签

    a标签和锚点 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  10. python:带参数的装饰器,函数的有用信息

    一.带参数的装饰器,函数的有用信息 def func1(): '''此函数的功能是完成的登陆的功能 return: 返回值是登陆成功与否(true,false) ''' print(333) func ...