一、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