为什么使用数据库
就个人体会而言,使用数据库相比使用普通的文件存储,主要有以下三点好处:
存储简单强大
数据库有通用标准SQL的语句来控制数据的存储,存储的数据相对规范,而普通文件存储,则需要自己每次都要编写代码,且存储数据的格式随意。
强大的数据管理
对我而言数据库对数据强大的管理系统是区别于一般文件存储的最大区别,数据采用的都是高度优化的代码,不管是查找、添加还是删除速度都是非常快的,实现这些仅仅只需几条简单的SQL语句就可以,而普通的文件存储想要达到这样的效果要花费的代价就太大太大了。另外数据库,还有一些高级的功能,如支持事务处理。
数据共享于权限管理
数据库可以通过网络为每个用户提供数据服务,还可以为这些用户分配不同的权限,从而实现数据的共享与数据的安全管理。
简单来说,如果数据只是一些无规律的信息,或是一些数据量非常小不需要过多操作的信息的话,使用普通的文件存储可能会更简单。但是如果数据的信息量大,经常需要去查询或修改的话,那就使用数据来管理就要方便得多了。
MySQL中MyISAM和InnoDB的优缺点
MySQL支持多种存储引擎,其中最常用的是:MyISAM和InnoDB
MyISAM
MyISAM是MySQL中最早出现的引擎,其执行速度快,但是不支持事务。MyISAM又可以分为三种子类型:
- 静态MyISAM: 表中各个数据列长度固定,是默认的类型,其执行效率非常高
- 动态MyISAM: 表中有有如varchar、xxxtext等类型的字段,其每条记录的长度不一,执行效率不如静态的,内存中也有可能造成许多碎片,需要经常用optimize tabel命令或优化工具整理碎片。
- 压缩MyISAM: 以上两种表通过myisamchk工具压缩后生成,这种表可以减少表占用的存储空间,但是压缩后不能被修改,读取时也需要先进行解压操作。
InnoDB
InnoDB是MySQL后面支持的引擎,它支持了事务、行级锁机制、外键约束的等高级的功能,但是它的执行效率比MySQL要低。
由于支持事务操作,InnoDB可以很方便的执行回滚操作,具体操作:
- 关闭自动提交:set autocommit=0;
- 开启事务: begin;
- 执行语句
- 正确提交:commit; 错误则回滚: rollback
为什么使用事务
在MySQL中InnoDB是支持事务的,使用事务的最大的好处是,由于事务的原子特性可以将一系列操作当作一个整体来执行,执行成功后提交,执行失败可以回滚到事务开始前,可以避免数据库由于在执行中途错误而无法返回到原来的初始状态的情况。
使用事务时,需要注意以下两点:
关闭自动提交
MySQL时默认打开自动提交的,所以要使用事务,需要先关闭自动提交:set autocommit = 0
某些SQL语句会导致事务的回滚失败
某些SQL语句如创建表\库、管理用户等,当执行完成后,会隐式的commit操作,在事务中包含有这些语句的,一旦出错,也无法回滚到事务执行的初始状态。在设计事务时不应该包含这些语句。这样的语句主要分以下三类:
- DDL语句:ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等
- 修改MYSQL架构的语句:CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD
- 管理语句:ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE
为什么使用引索
数据表的引索就像书的目录,为数据表创建引索,可以大大提高查找的执行效率。索引常常被用来快速找出在一个列上用一特定值的行,没有引索,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行,表越大,花费时间越多。所以经常用WHERE语句做条件判断的列较适合创建引索。
创建一个或多个引索的SQL语句为:
1 | ALTER TABLE tbl_name ADD INDEX(col1,col2,...) |
特殊的创建表的主键时,就会自动创建主键列引索,它数据唯一引索。
参考
- 浅谈MySql的存储引擎(表类型)
:http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html