MySQL

来源:互联网 发布:淘宝一次破损补寄条款 编辑:程序博客网 时间:2024/06/05 23:45

char与varchar

char和varchar 后面的长度表示的是字符的个数,而不是字节数。
如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.例外:长度小于4个字符的char数据列不会被转换为varchar类型。
区别:
1)char 表示定长,长度固定,varchar表示变长,即长度可变
2)char最多能存放的字符个数 255,和编码无关;
varchar最大有效长度是 65532 字节,在varchar存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2 = 65532字节,字符根据编码来定。
3)char的效率高,没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作,varchar更新数据需要重新计算长度
4)varchar相对来说比较灵活,可动态分配空间,char设置长度不合理时可能会浪费空间。

数据库事务四大特性

原子性:事务中包含的程序作为数据库的逻辑工作单位,它对数据库中的数据进行操作时,要么全部执行,要么都不执行。
一致性:一个事务执行前和执行后,数据库都必须要处于一致性的状态。(你给小A的卡里转了500块,不管怎么样你卡里的钱和小A卡里的钱的总和是不变的。)
隔离性:指在并发的事务是相互隔离的。即一个事务的内部操作及正在操作的数据必须被封锁起来,不会被其他的事务来企图修改。
持久性:持久性是指当数据库系统出现故障了,要确保已经提交的事务的更新是不会丢失的。即数据库中的数据的修改是永久性的。就算系统出现了故障,我们也可以使用数据库的备份和恢复来保证数据的修改。

事务的隔离级别

1.未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他事务中未提交事务修改的数据。(会出现脏读、不可重复读、幻读)
2.提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 。(会出现不可重复读、幻读)
3.可重复读(Repeated Read):可重复读。同一事务中所有的 查询均读取第 一次读取时已确定的快照,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读。(但是还存在幻象读)
4.串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞,在事务中的任何时候所看到的数据都是事务启动时刻的状态,不论在这期间有没有其他事务已经修改了某些数据并提交。

对于高并发应用来说,为了尽可能保证数据的一致性,自然是事务隔离级别越高越好。但是,隔离级别越低,事务请求的锁越少或保持锁的时间就越短,性能越好。虽然 Innodb 存储引擎默认的事务隔离级别是 REPEATABLE READ,但实际上在我们大部分的应用场景 下,都只需要 READ COMMITED 的事务隔离级别就可以满足需求了。

脏读 :一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. 相反, “可重复读”在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。
幻读 :一个事务读到另一个事务已提交的insert数据

MySQL存储引擎MyISAM和InnoDb

区别
innodb支持事务;
innodb支持外键;
innodb支持行锁;
myisam数据和索引分开放,innodb数据和索引放一起;
索引表:myisam叶子节点存放数据地址;innodb叶子节点存放真实的数据记录。(原因如上)
myisam查询快,innodb写入快;

为什么并发高时InnoDb写入快
InnoDb支持行级锁,写入时只锁一行,myisam写入时会锁表。更新数据时,innodb只需要修改叶子节点,myisam需要修改索引结构(改动大)。
为什么MyISAM查询速度快(InnoDb维护的东西多)
1)INNODB要缓存数据块,MYISAM只缓存索引块,这中间还有换进换出的减少;
2)innodb寻址要映射到块,再到行,MYISAM记录的直接是文件的OFFSET,定位比INNODB要快
3)INNODB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护

Innodb行级锁和事务性,容易产生死锁,优化建议:
a) 类似业务模块中,尽可能按照相同的访问顺序来访问,防止产生死锁;
b) 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
c) 对于非常容易产生 锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率

MySQL主从复制和读写分离:

MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作。master将写操作的变更同步到各个slave节点。MySQLProxy实际上是在客户端请求与MySQLServer之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer上。对于多节点Slave集群,也可以起做到负载均衡的效果。
MySQL读写分离能提高系统性能的原因在于:
1.物理服务器增加,机器处理能力提升。拿硬件换性能。
2.主从只负责各自的读和写,极大程度缓解X锁和S锁争用。
3.slave可以配置myisam引擎,提升查询性能以及节约系统开销。
4.master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。
5.slave可以单独设置一些参数来提升其读的性能。
6.增加冗余,提高可用性。

数据库查询优化

1.永远用小结果集驱动大的结果集
2.只取出自己需要的 Columns
3.仅仅使用最有效的过滤条件
4.尽可能避免复杂的 Join 和子查询(减少锁表),分解为几个小查询
5.使用count(*)获取行数效率高,count(列名)只记录非NULL的列。
6.like ‘word%’可以用到缓存,’%word%’用不到缓存
7.分区partition by,分表分库

建立索引原则

1.最左前缀匹配原则。
2.尽量选择区分度高的列作为索引。
3.索引列不能参与计算。
4.尽量的扩展索引,不要新建索引。
5.索引字段长度尽量的小。
6.较频繁的作为查询条件的字段应该创建索引,更新非常频繁的字段不适合创建索引。

MySQL安全设置

1.定期做数据备份
2.不给root权限,合理安排权限
3.关闭远程访问
4.设置MySQL数据文件的权限

原创粉丝点击