Mysql做到高并发几点注意事项

1、拆分大的DELETEINSERT语句

 

如果你需要在一个在线的网站上去执行一个大的DELETEINSERT查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。

 

如果你把你的表锁上一段时间,比如30秒钟,那么对于一个有很高访问量的站点来说,这30秒所积累的访问进程/线程,数据库链接,打开的文件数,可能不仅仅会让你泊WEB服务Crash,还可能会让你的整台服务器马上掛了。

所以,如果你有一个大的处理,你定你一定把其拆分,使用LIMIT条件是一个好的方法。下面是一个示例

 

 

2垂直分割

垂直分割是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。(以前,在银行做过项目,见过一张表有100多个字段,很恐怖)

示例一:在Users表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段。那么,为什么不把他放到另外一张表中呢?这样会让你的表有更好的性能,大家想想是不是,大量的时候,我对于用户表来说,只有用户ID,用户名,口令,用户角色等会被经常使用。小一点的表总是会有好的性能。

示例二:你有一个叫“last_login”的字段,它会在每次用户登录时被更新。但是,每次更新时会导致该表的查询缓存被清空。所以,你可以把这个字段放到另一个表中,这样就不会影响你对用户ID,用户名,用户角色的不停地读取了,因为查询缓存会帮你增加很多性能。hp程序员之家

另外,你需要注意的是,这些被分出去的字段所形成的表,你不会经常性地去Join他们,不然的话,这样的性能会比不分割时还要差,而且,会是极数级的下降

 

3选择正确的存储引擎

MySQL中有两个存储引擎MyISAMInnoDB,每个引擎都有利有弊。酷壳以前文章《MySQL: InnoDB 还是 MyISAM?》讨论和这个事情。hp程序员之家

MyISAM适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM对于 SELECT COUNT(*) 这类的计算是超快无比的。 www~phperz~com

InnoDB的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM还慢。他是它支持行锁,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

 

Myisam读的效果好,写的效率差,这和它数据存储格式索引的指针锁的策略有关的

数据存储格式:Myisam的数据是顺序存储的innodb数据存储方式是聚簇索引

索引的指针:Myisam的索引btree上的节点是一个指向数据物理位置的指针,所以查找起来很快,innodb索引节点存的则是数据的主键,所以需要根据主键二次查找

锁的策略:Myisam锁是表锁,只有读读之间是并发的写写之间和读写之间(读和插入之间是可以并发的,去设置concurrent_insert参数,定期执行表优化操作,更新操作就没有办法了)是串行的,所以写起来慢,并且默认的写优先级比读优先级高高到写操作来了后,可以马上插入到读操作前面去,如果批量写,会导致读请求饿死,所以要设置读写优先级或设置多少写操作后执行读操作的策略;Myisam不要使用查询时间太长的sql,如果策略使用不当,也会导致写饿死,所以尽量去拆分查询效率低的sql

Innodb一般都是行锁,这个一般指的是sql用到索引的时候,行锁是加在索引上的,不是加在数据记录上的,如果sql没有用到索引,仍然会锁定表mysql的读写之间是可以并发的,普通的select是不需要锁的,当查询的记录遇到锁时,用的是一致性的非锁定快照读,也就是根据数据库隔离级别策略,会去读被锁定行的快照,其它更新或加锁读语句用的是当前读,读取原始行;因为普通读与写不冲突,所以innodb不会出现读写饿死的情况,又因为在使用索引的时候用的是行锁,锁的粒度小,竞争相同锁的情况就少,就增加了并发处理,所以并发读写的效率还是很优秀的,问题在于索引查询后的根据主键的二次查找导致效率低;

注意:

Innodb 聚集索引是按照主键(primarykey)进行聚集,被索引的列其实是主键列,如果没定义主键,Innodb会试着使用唯一非空索引Unique Index来代替。其他索引(普通索引)中不会保存行的物理位置,而是保存主键的值,所以通过"二级索引"进行查找是先找到主键,再找到行,要进行二次索引查找


组合索引和单列索引
组合索引在多列上创建,单列索引在一个列上创建。
查询使用索引的条件不同一般组合索引需要按照最左前缀来执行查询,并不是每个列都需要覆盖,只是从左边的列开始组合。

原因:

多列索引是先按照第一列进行排序,然后在第一列排好序的基础上再对第二列排序,如果没有第一列的话,直接访问第二列,那第二列肯定是无序的,直接访问后面的列就用不到索引了。索引的最大好处就是:它必然是有序的如果这个优点都不能利用,那索引也就没什么价值了。


例如有索引key(a,b,c)
³where a=xx and b=xx and c=xxx 此语句可以用到索引
³where b=xx and a=xx and c=xxx 同上,顺序没有关系,同样能用到索引
³where a=xx and b=xx 可以用到索引
³where a=xx and c=xx 可以用到索引这个以前一直理解错了
³where b=xx and c=xx 用不到索引
³where b=xx 用不到索引
³where c=xx 用不到索引

 

 

 

你可能感兴趣的:(mysql)