《高性能mysql》阅读笔记

四种事务隔离级别:读未提交,读已提交,重复读,可串行化

mysql的默认隔离级别是重复读



大多数Mysql事务引擎是使用MVCC(多版本并发控制)和行加锁机制关联使用

MVCC只工作在:读已提交和重复读两个隔离级别


MySQL这3种锁的特性可大致归纳如下。

开销、加锁速度、死锁、粒度、并发性能
          表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
          行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
          页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

benchmark简单测试函数的执行效率

select benchmark(100000,MD5('hello wlord'));

select benchmark(100000,SHA1('hello wlord'));



需要了解视图的内在实现过程才能更好的达到优化的作用

视图通常有临时表算法和合并算法两种实现方式

explain select * from <view_name>

结果是derived时表示的是临时表算法


需要索引的原因:

1强化完整性约束,提高验证效率

2在频繁使用order by,union,group语句下可以提高查询效率(如果排序的的列有多个可以在这些列上建立复合索引,排序的列来自不同的表时慎用索引)

3可以提高多表join的效率

创建索引的原则:

1最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
3.在大表的常用且值重复几率小的字段上创建索引(B+树二分查找的特性决定的)
4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
5.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可



百万级数据库查询优化策略:

 1使用union来避免大数据表行的顺序存取如:

select * from order where (customer_num=104 and order_num>1001) or order_num=108

虽然customer_num和order_num上建有索引但是上面的语句还是使用顺序存储来扫描整张表,因为这个语句要检索的是分离行的集合


优化为:

select * from order where (customer_num=104 and order_num>1001)

union

select * from order whereorder_num=108


2避免相关子查询

3避免困难的正则表达式否则索引失效

4where的第一个查询条件要在复合索引的列内否则索引失效

5where条件里不要有!=和 <>否则索引失效

6in和not in要慎用尽量用between代替否则索引失效

7where条件里不要有null的判断否则索引失效

8尽量用数字型字段少用字符型

9创建临时表时如果插入的数据过多可以用select into代替create table

10尽量使用int代替字符类型的

11尽量少用or否则会放弃索引全盘扫描

慢查询优化基本步骤

0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
2.explain查看执行计划(explain的用法http://database.51cto.com/art/201108/284783.htm),是否与1预期一致(从锁定记录较少的表开始查询)
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析

具体实战参考这篇文章http://tech.meituan.com/mysql-index.html


千万级数据库插入速度和读取速度的调整

提高数据库插入性能中心思想:尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作。这次修改了下面四个配置项:

1)将 innodb_flush_log_at_trx_commit 配置设定为0;

2)将 innodb_autoextend_increment 配置由于默认8M 调整到 128M

3)将 innodb_log_buffer_size 配置由于默认1M 调整到 16M

4)将 innodb_log_file_size 配置由于默认 8M 调整到 128M


提升数据库读取速度,从数据库层面上读取速度提升主要由于几点:简化SQL、加索引和分区; 经过检查程序SQL已经是最简单,查询条件上已经增加索引。我们只能用武器:表分区。分区类型:RANGE分区,LIST分区,HASH分区,KEY分区

详情可以查看

http://blog.itpub.net/23490154/viewspace-1063390/

https://my.oschina.net/ydsakyclguozi/blog/393583


事务的四个特征

A:原子性(Atomicity)

       事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
       事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
      一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
      一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

 

Mysql各种索引区别:

普通索引(INDEX):最基本的索引,没有任何限制
唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。
全文索引(FULLTEXT ):仅可用于 MyISAM 表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。

关于索引的原理详细可以参考这篇文章

http://mp.weixin.qq.com/s?__biz=MzIxMTY5ODEwMQ==&mid=2247483747&idx=1&sn=f30dccfaa7c1860bf5210e03dddce888&chksm=975029b9a027a0af96d8223496f14e28bf4869c565e5f09b8c1f8b9ee0a6fab94ffd71dbc01c&mpshare=1&scene=23&srcid=1222k4mH6XQml4w74yDdIVIx#rd


聚簇索引和非聚簇索引

      索引分为聚集索引聚集索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

         InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。 

  MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

详细分析见:

http://www.admin10000.com/document/5372.html

原理是基石,只有充分了解InnoDB索引的工作方式,我们才有能力高效的使用好它


猜你喜欢

转载自blog.csdn.net/jishuisanqianli/article/details/53055742