设为首页 加入收藏

TOP

mysql优化总结(一)(一)
2015-11-21 02:04:10 来源: 作者: 【 】 浏览:0
Tags:mysql 优化 总结

一、mysql的sql_mode模式:

(1)、该模式指的是sql模式可控制服务器操作的方式,并且sql模式存在于全局与会话级别。如果想知道全局级或会话级SQL模式的当前值,可以使用的语句为:

mysql> SELECT @@GLOBAL.sql_mode,mysql> SELECT @@SESSION.sql_mode。

(2)、如果想知道SQL模式的当前值,可以使用:SELECT @@sql_mode。

?

二、有的mysql使用的默认的存储引擎为InnoDB,有的 默认的存储引擎为MyISAM。这种两种是最常用的。这两种引擎有六大区别:

?

存储类型: MyISAM InnoDB
构成上的区别: 1.每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。
2..frm文件存储表定义。
3.数据文件的扩展名为.MYD (MYData)。
4.索引文件的扩展名是.MYI (MYIndex)。
基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB
事务处理上方面: MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持 InnoDB提供事务支持事务,外部键等高级数据库功能
SELECT UPDATE,INSERT,Delete操作 如果执行大量的SELECT,MyISAM是更好的选择 1.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表
2.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
3.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用
对AUTO_INCREMENT的操作 1.每表一个AUTO_INCREMEN列的内部处理。
2.MyISAM为INSERT和UPDATE操作自动更新这一列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。
3.AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置
4.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引
5.更好和更快的auto_increment处理
1.如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。
2.自动增长计数器仅被存储在主内存中,而不是存在磁盘上
3.关于该计算器的算法实现,请参考
4.AUTO_INCREMENT列在InnoDB里如何工作
表的具体行数 select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的 InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行
表锁

提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

?

?

三、为什么有大量数据操作的时候要用到InnoDB数据库
所谓事务处理,就是原子性操作。
打个比方,支持事务处理的Innodb表,建设一个中,发帖是给积分的。你发了一个帖子执行一个insert语句,来插入帖子内容,插入后就要执行一个update语句来增加你的积分。假设一种特殊情况突然发生,insert成功了,update操作却没有被执行。也就是说你发了帖子却没有增加相应的积分。这就会造成用户不满。如果使用了事务处理,insert和update都放入到事务中去执行,这个时候,只有当insert和update两条语句都执行生成的时候才会将数据更新、写入到中,如果其中任何一条语句失败,那么就会回滚为初始状态,不执行写入。这样就保证了insert和update肯定是一同执行的。
mysiam表不支持事务处理,同时mysiam表不支持外键。外键不用说了吧?不知道的话,去网上查吧。
同时,在执行数据库写入的操作(insert,update,delete)的时候,mysiam表会锁表,而innodb表会锁行。通俗点说,就是你执行了一个update语句,那么mysiam表会将整个表都锁住,其他的insert和delete、update都会被拒之门外,等到这个update语句执行完成后才会被依次执行。
而锁行,就是说,你执行update语句是,只会将这一条记录进行锁定,只有针对这条记录的其他写入、更新操作会被阻塞并等待这条update语句执行完毕后再执行,针对其他记录的写入操作不会有影响。
因此,当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快

?

四、千万级数据量的数据大表该如何优化?

1).数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;
2).数据项:是否有大字段,那些字段的值是否经常被更新;
3).数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;
4).数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;
5).SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?
6).预计大表及相关联的SQL,每天总的执行量在何数量级?
7).表中的数据:更新为主的业务 还是 查询为主的业务
8).打算采用什么数据库物理服务器,以及数据库服务器架构?
9).并发如何?
10).存储引擎选择InnoDB还是MyISAM?
大致明白以上10个问题,至于如何设计此类的大表,应该什么都清楚了!
至于优化若是指创建好的表,不能变动表结构的话,那建议InnoDB引擎,多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈,另外对优化索引结构去解决性能问题的话,建议优先考虑修改类SQL语句,使他们更快些,不得已只靠索引组织结构的方式,当然此话前提是,索引已经创建的非常好,若是读为主,可以考虑打query_cache,以及调整一些参数值:sort_buffer_size,read_buffer_size,read_r

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据切分――原理 下一篇NavicatforMySQL无法插入中文问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: