(mysql-5.5.5开始,InnoDB做为默认存储引擎)以前是MyISAM,更早是ISAM你能用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎,就必须从新编译MYSQL。在缺省状况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEYDB(BDB), 也经常可使用。php
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。所以,ISAM执行读取操做的速度很快,并且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不可以容错:若是你的硬盘崩溃了,那么数据文件就没法恢复了。若是你正在把ISAM用在关键任务应用程序里,那就必须常常备份你全部的实时数据,经过其复制特性,MYSQL可以支持这样的备份应用程序。java
MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎(5.5以前)。除了提供ISAM里所没有的索引和字段管理的大 量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操做。其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的 MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。mysql
MYISAM强调了快速读取操做,这可能就是为何MYSQL受到了WEB开发如此青睐的主要缘由:在WEB开发中你所进行的大量数据操做都是读取操做。因此,大多数虚拟主机提供商和INTERNET平台提供商只容许使用MYISAM格式。c++
HEAP容许只驻留在内存里的临时表格。驻留在内存使得HEAP比ISAM和MYISAM的速度都快,可是它所管理的数据是不稳定的,并且若是在关机以前没有进行保存,那么全部的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间,HEAP表格在你须要使用SELECT表达式来选择和操控数据的时候很是有用。要记住,用完表格后要删除表格。web
INNODB和BERKLEYDB(BDB)数据库引擎都是造就MYSQL灵活性的技术的直接产品,这项技术就是MySql++ API。在使用MySql的时候,你所面对的每个挑战几乎都源于ISAM和MYIASM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MYISAM引擎慢不少,可是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,若是你的设计须要这些特性中的一者或者二者,那你就要被迫使用后两个引擎中的一个了。sql
根据锁的类型分,能够分为共享锁,排他锁,意向共享锁和意向排他锁。数据库
根据锁的粒度分,又能够分为行锁,表锁。编程
对于mysql而言,事务机制更可能是靠底层的存储引擎来实现,所以,mysql层面只有表锁,而支持事务的innodb存 储引擎则实现了行锁(记录锁(在行相应的索引记录上的锁)),gap锁(是在索引记录间歇上的锁),next-key锁(是记录锁和在此索引记录以前的gap上的锁的结合)。Mysql的记录锁实质是索引记录的锁,由于innodb是索引组织表;gap锁是索引记录间隙的锁,这种锁只在RR隔离级别下有效;next-key锁是记录锁加上记录以前gap锁的组合。mysql经过gap锁和next-key锁实现RR隔离级别。安全
说明:对于更新操做(读不上锁),只有走索引才可能上行锁;不然会对聚簇索引的每一行上写锁,实际等同于对表上写锁。服务器
若多个物理记录对应同一个索引,若同时访问,也会出现锁冲突;
当表有多个索引时,不一样事务能够用不一样的索引锁住不一样的行,另外innodb会同时用行锁对数据记录(聚簇索引)加 锁。
MVCC(多版本并发控制)并发控制机制下,任何操做都不会阻塞读操做,读操做也不会阻塞任何操做,只由于读不上锁。
共享锁:由读表操做加上的锁,加锁后其余用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写
排它锁:由写表操做加上的锁,加锁后其余用户不能获取该表或行的任何锁,典型是mysql事务中的更新操做
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
1.若是MYSQL客户端和服务器端的链接须要跨越并经过不可信任的网络,那么须要使用ssh隧道来加密该链接的通讯。
2.使用set password语句来修改用户的密码,先“mysql -u root”登录数据库系统,而后mysql> update mysql.user set password=password(‘newpwd’),最后执行flush privileges就能够了。
3.Mysql须要提防的***有,防偷听、篡改、回放、拒绝服务等,不涉及可用性和容错方面。对全部的链接、查询、其余操做使用基于acl即访问控制列表的安全措施来完成。也有一些对ssl链接的支持。
4.设置除了root用户外的其余任何用户不容许访问mysql主数据库中的user表; 加密后存放在user表中的加密 后的用户密码一旦泄露,其余人能够随意用该用户名/密码相应的数据库;
5.使用grant和revoke语句来进行用户访问控制的工做;
6.不要使用明文密码,而是使用md5()和sha1()等单向的哈系函数来设置密码;
7.不要选用字典中的字来作密码;
8.采用防火墙能够去掉50%的外部危险,让数据库系统躲在防火墙后面工做,或放置在dmz区域中;
9.从因特网上用nmap来扫描3306端口,也可用telnet server_host 3306的方法测试,不容许从非信任网络中访问数据库服务器的3306号tcp端口,须要在防火墙或路由器上作设定;
10.为了防止被恶意传入非法参数,例如where id=234,别人却输入where id=234 or 1=1致使所有显示,因此在web的表单中使用”或””来用字符串,在动态url中加入%22表明双引号、%23表明井号、%27表明单引号;传递未检查过的值给mysql数据库是很是危险的;
11.在传递数据给mysql时检查一下大小;
12.应用程序须要链接到数据库应该使用通常的用户账号,开放少数必要的权限给该用户;
13.在各编程接口(c c++ php perl java jdbc等)中使用特定‘逃脱字符’函数; 在因特网上使用mysql数据 库时必定少用传输明文的数据,而用ssl和ssh的加密方式数据来传输;
14.学会使用tcpdump和strings工具来查看传输数据的安全性,例如tcpdump -l -i eth0 -w -src or
dst port 3306 strings。以普通用户来启动mysql数据库服务;
15.不使用到表的联结符号,选用的参数 –skip-symbolic-links;
16.确信在mysql目录中只有启动数据库服务的用户才能够对文件有读和写的权限;
17.不准将process或super权限付给非管理用户,该mysqladmin processlist能够列举出当前执行的查询 文本;super权限可用于切断客户端链接、改变服务器运行参数状态、控制拷贝复制数据库的服务器;
18.file权限不付给管理员之外的用户,防止出现load data ‘/etc/passwd’到表中再用select 显示出来
的问题;
19.若是不相信dns服务公司的服务,能够在主机名称容许表中只设置ip数字地址;
20.使用max_user_connections变量来使mysqld服务进程,对一个指定账户限定链接数;
21.grant语句也支持资源控制选项;
22.–local-infile=0或1 如果0则客户端程序就没法使用local load data了,赋权的一个例子grant insert(user) on mysql.user to ‘user_name’@’host_name’;若使用–skip-grant-tables系统将对任何用户的访问不作任何访问控制,但能够用 mysqladmin flush-privileges或mysqladmin reload来开启访问控制;默认状况是show databases语句对全部用户开放,能够用–skip-show-databases来关闭掉。
23.碰到error 1045(28000) access denied for user ‘root’@’localhost’ (using password:no)错误时,你须要从新设置密码,具体方法是:先用–skip-grant-tables参数启动mysqld,而后执行 mysql -u root mysql,mysql>update user set password=password(’newpassword’) where user=’root’;mysql>flush privileges;,最后从新启动mysql就能够了。
文章推介:
1.sql必会基础1
点击技术群加小编微信入群。
Java架构师历程mush专一于为java工程师提供技术干货的文章平台,使其从小牛历练到大拿,在架构师的路上一路前行,共学习,共进步;