mysql杂记

 

1 n+1sql vs 表关联,n+1获胜

http://www.iteye.com/topic/1116737

2 性能优化的建议

http://coolshell.cn/articles/1846.html

数据库的优化点有:

需求和架构及业务实现优化: 55%
Query语句的优化: 30%
数据库自身的优化: 15%

3 主要的存储引擎MyISAM,InnodB。存储文件不一样,InnodB支持事务,有redo、checkpoint保证crash之后,依旧可以回滚数据,InnodB支持行锁。MyISAM读操作效率较高,写操作会锁表,而InnodB适用于写操作较多的场景,并发能力较强。

4 mysql根据锁定资源粒度的大小分为行锁(Innodb、NDBCluster)、页锁(BerkeleyDB)、表锁(MyISAM , Memory , CSV等非事务引擎),随着粒度增大,并发能力变弱,对相同数据量进行锁定耗费的资源越小。

5 innodB的使用方式

行锁是innodB实现高并发的重要手段,因为它的细粒度。行级锁加在索引上,而不是数据块。Innodb通过在指向数据记录的第一个索引键之前和最后一个索引键之后的区域空间上标记锁定信息而实现的。Innodb 的这种锁定实现方式被称为“NEXT-KEY locking”(间隙锁),即如果操作1《列值《10,哪怕只有一条记录列值=3,在可重复读的隔离级别下,也无法插入列值在这个范围内的新数据。

要想合理利用Innodb的行级锁定,做到扬长避短,我们必须做好以下工作:
a)尽可能让所有的数据检索都通过索引来完成,从而避免Innodb因为无法通过索引键加锁而升级
为表级锁定。即只有通过索引条件检索的查询才会使用行锁;由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。

http://chqz1987.blog.163.com/blog/static/51438311201311852848513/
b)合理设计索引,让Innodb在索引键上面加锁的时候尽可能准确,尽可能的缩小锁定范围,避免
造成不必要的锁定而影响其他Query的执行;
c)尽可能减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定
的记录;
d)尽量控制事务的大小,减少锁定的资源量和锁定时间长度;
e)在业务环境允许的情况下,尽量使用较低级别的事务隔离,以减少MySQL因为实现事务隔离级
别所带来的附加成本;

 合理的表大小实践

http://blog.csdn.net/yah99_wolf/article/details/7082772

关键在于表的大小和Innodb buffer pool的对比,超过Innodb buffer pool是一个临界点

 http://blog.csdn.net/yunhua_lee/article/details/7082772

6 使用中文字符的话,必须使用gbk

http://blogold.chinaunix.net/u/21684/showart_208239.html

7 由于 Innodb 是事务安全的存储引擎,所以系统 Crash 对他来说并不能造成非常严重的损失,由于有 redo 日志的存在,有 checkpoint 机制的保护,Innodb 完全可以通过 redo 日志将数据库 Crash 时刻已经完成但还没有来得及将数据写入磁盘的事务恢复,也能够将所有部分完成并已经写入磁盘的未完成事务回滚并将数据还原。

 8 索引

B-tree索引,是使用最频繁的一种索引方式,按照平衡树的结构存储,数据存放在叶子节点。innodB进行了一些变种,使用了B+tree,叶子节点除了存放索引键信息之外,还有指向下一个相邻叶子节点的指针,可以加快检索相邻节点的效率。

innoDB包含两种索引,一种是以列值为key,主键为value的二级索引;另一种是主键索引(也称聚集索引),他不仅有主键,还包含主键所有的全部数据,所以在innodB里主键索引即数据。两种索引的叶子节点都有指向前驱和后继叶子节点的双向指针。

使用索引的好处是,检索如果能够用到的话,那么可以避免全表扫描,提高检索效率;坏处是每次对索引字段的更新,都要调整索引,另外索引本身也浪费存储空间。需要权衡字段的读写频率。

当where后面有多个条件的时候,组合索引的效率更高,但是代价也比较大一点。

 

 9 事务介绍

http://blog.sina.com.cn/s/blog_3fc85e260100msz3.html

10 select * from `XXXX` where order by id asc limit 2000 这个语句会导致全表扫描,因为没有过滤条件,mysql会先将所有符合条件的数据扫描出来,然后排序,取2000。哪怕主键本身已经默认排序了,mysql依然会进行全表扫描。

 

11 redo log与checkpoint

http://blog.csdn.net/yunhua_lee/article/details/6567869

 

你可能感兴趣的:(mysql)