mysql负载,查询优化,索引和锁等

标签: mysql 负载 优化 | 发表时间:2014-09-27 12:50 | 作者:iluoxuan
出处:http://www.iteye.com

mysql引擎有多种,每种实现的索引方式也不尽相同:

 

有hash索引,b树索引,b+树索引

 

我这边接触最大的是innodb引擎:

 

支持外键和事务:

b+树索引的类型“

1:InnoDB的主键索引(Primary Key)是Cluster形式的(聚簇索引)。:   按主键值生产b+树,叶子节点放的列的数据

 2:InnoDB的非主键索引(Secondary Index)是普通的B-Tree索引。 按索引值产生b+树,叶子节点放的对应的主键值

 

所以二级索引先按索引值找到主键值在按1方式找到数据

 

mysql按主键key作为内节点;所以选择非常重要

1: 尽量用自增的整形 // 插入的时候直接插入b+树后面

2:不要用随机字符串和uuid等 // 插入的时候要移动b+很多节点

3:   如果没有主键,会选择唯一索引值生成聚簇索引,都没有mysql内部会自动生成自key,效果更佳

4:key的长度不要太大

索引的优化:

     1: 最左原则(b+树性质)A B C 联合所以 只能使用到 A  ;  A  B  ; A  B C  

                            如果要查询A C 可以添加再添加一个联合索引A C

     2:范围查询:  where A < 100 and  A > 90 这个时候 只有第一个A<100才能用到索引,因为这个时候

                           使用索引会对索引的数据加行锁,

     3: order by ,group by 、union 、distinct 等排序字段 :的字段在执行计划中利用了索引时,不用排序操作,否则要排序。

     4:  索引字段不能有函数计算和表达式计算: (否则不走索引)

     5:  尽量避免使用null,

     6: 查询的时候,一个表只能使用一个索引(内部优化选择最好的) 很重要

    

 查询优化: 

     1: jion代替in子查询

      jion原理和优化:

       mysql只使用了大名鼎鼎的Nested Loop Join算法:就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果有多个join,则将前面的结果集作为循环数据,再一次作为循环条件到后一个表中查询数据

     join语句的优化

  1. 用小结果集驱动大结果集,尽量减少join语句中的Nested Loop的循环总次数;

  2. 优先优化Nested Loop的内层循环,因为内层循环是循环中执行次数最多的,每次循环提升很小的性能都    能在整个循环中提升很大的性能;

 3. 对被驱动表的join字段上建立索引;

 4. 当被驱动表的join字段上无法建立索引的时候,设置足够的Join Buffer Size。

    in子查询比jion慢:

唯一不同的是对于in子查询它每次执行内部查询的时候都必须重新构造一个JOIN结构,完成相应的初始化操作,并且在这次内部查询结束之后,要完成相应的析构函数,如index_init,index_end,而当外部查询是全表扫描的时候这些操作的次数就是它的记录数,那么它们(构造,析构)所占用的性能也是显而易见的。简单一句话子查询的性能除了查询外,还消耗在JOIN的构造与析构过程

 

所以我们在选择in的时候:都不用子查询而是通过:

in(id1, id2, id3)  避免使用 in (select * xxx)

可以考虑:

如: select  b, c from A where d = (select max(d) from B) ...

优化为: select b, c from A xa , (select max(d) as md from B) as xd

where xa.d = xd.md

 

   上面介绍的优化,大部分常用;具体分析的时候最好能用decs 或者 explain看下sql执行的情况分析

和优化:

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [mysql 负载 优化] 推荐:

mysql负载,查询优化,索引和锁等

- - 开源软件 - ITeye博客
mysql引擎有多种,每种实现的索引方式也不尽相同:. 有hash索引,b树索引,b+树索引. 我这边接触最大的是innodb引擎:. 1:InnoDB的主键索引(Primary Key)是Cluster形式的(聚簇索引). :   按主键值生产b+树,叶子节点放的列的数据.  2:InnoDB的非主键索引(Secondary Index)是普通的B-Tree索引.

mysql优化

- - 数据库 - ITeye博客
公司网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL  的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL  默认的系统参数能够让 MySQL运行得非常顺畅. 在Apache, PHP,  MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.

mysql优化

- - 数据库 - ITeye博客
      1.通过 show (session 或者 global) status 来查看( 当前连接 或者 数据库上次开机以来 )的服务器状态信息,默认是session.         例如:show status like '%com_%' : com_XXX表示XXX语句执行的总次数,这总次数是针对所有引擎的总和.

[MySQL优化案例]系列 — 典型性索引引发CPU负载飙升问题

- - MySQL中文网 - 叶金荣的技术和生活
收到一个mysql服务器负载告警,上去一看,load average都飙到280多了,用top一看,CPU跑到了336%,不过IO和内存的负载并不高,根据经验,应该又是一起索引引起的惨案了. 看下processlist以及slow query情况,发现有一个SQL经常出现,执行计划中的扫描记录数看着还可以,单次执行耗时为 0.07s,还不算太大.

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

mysql 引擎优化

- - CSDN博客推荐文章
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的. 要添加一个新的引擎,就必须重新编译MYSQL. 在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP. 另外两种类型INNODB和BERKLEY(BDB),也常常可以使用. 如果技术高超,还可以使用MySQL++ API自己做一个引擎.

mysql参数优化

- - CSDN博客推荐文章
### 用来存放InnoDB的内部目录,对于大数据设置16M足够用. ### InnoDB 缓存总大小设置,一般设置为系统内存的70%-80%. ### 指定所有InnoDB数据文件的路径和大小分配. ### 文件读写io数设置:. ### InnoDB内核的并发线程数设置. ### 设置日值的大小.

Zabbix 的 MySQL 优化

- - SegmentFault 最新的文章
为 Zabbix 优化 MySQL. 标签(空格分隔): Zabbix MySQL Optimizing 优化. Aurimas Mikalauskas,原文是. Zabbix 和 MySQL. 在大型的 Zabbix 环境中,遇到的挑战大部分是 MySQL 以及更具体的说是 MySQL 磁盘 IO.

mysql优化方法

- - 数据库 - ITeye博客
通过show status和应用特点了解各种SQL的执行频率. 通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladmin extended-status命令获得. SHOW STATUS可以根据需要显示session级别的统计结果和global级别的统计结果. 以下几个参数对Myisam和Innodb存储引擎都计数:.

Mysql性能优化

- - 数据库 - ITeye博客
MySQL性能优化.   性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间. 性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等.   数据库管理人员可以使用SHOW STATUS语句来查询MySQL数据库的性能. 语法:SHOW STATUE LIKE ‘value’;其中value参数是常用的几个统计参数.