mysql的三种锁:
表锁:开销小加锁快,不容易出现死锁。缺点:并发低
行锁:开销大,加锁慢,容易出现死锁。优点:并发高
页面锁:开销和加锁时间介于表锁和行锁之间,会出现死锁。锁定粒度介于表锁和行锁之间。并发一般
Mysql的存储引擎
MYISAM
不支持事务,每次操作都是原子操作
支持表级锁,每次操作都是对表加锁
一个MYISAM 分为三个部分索引文件、数据文件、表结构文件
采用非聚集索引,索引文件的数据指向数据文件的指针。辅助索引和主索引一致
Innodb
支持ACID事务,支持事务四种隔离级别
支持行级锁及其外键约束,可以支持写锁并发
一个Innodb存储引擎,存储在一个文件空间(共享表空间,表达小不受空间限制,一个表可以存储在多个文件里)也可能为多个
(设置独立表,表大小受操作系统限制,一般为2G)受操作系统文件系统限制
主键索引采用的是聚集索引(索引的数据存储在文件本身)辅索引的数据域存储的主键的值,需要通过辅索引找到主键的值
再访问辅索引;最好采用自增主键,防止数据插入时,为维持B+树,造成文件的大调整
CHAR和VARCHAR的区别
CHAR长度为声明时的固定长度,会采用空格填充后面不足的数据检索时删除后面的空格
标准表最多能够创建16个索引
NOW() 表示年月日时分秒
CURRENT_DATE() 表示年月日
数据库如何优化
1、设计良好数据表结构,允许部分数据冗余,尽量避免Join的使用
2、选择适合的表字段类型和搜索引擎,适当的添加索引
3、主从分离,读写分离
4、找规律分表,提高查询速度
5、添加缓存机制 包括memcached、encache等等
6、不经常修改页面,生成静态页面
7、优化SQL语句
锁的优化策略
1、读写分离
2、分段加锁
3、减少锁的持有时间
4、多个线程尽量以相同的顺序来访问数据库
5、锁的细粒度化不需要太过了,容易造成线程不断地切换上下文,造成性能下降
在缺省模式下,MySQL是autoCommit模式的所有的数据库操作即时提交的所以在默认情况下mysql是不支持事务的
如果你想使用MySQL事务你必须设置autocommit=-0 这样mysql在非autocommit下工作,你必须使用commit来提交你的修改
什么情况下造成索引无法使用
以‘%’开头的like模糊匹配
Or语句前后没有使用索引
如何优化mysql
1、SQL语句优化和索引优化
2、数据库表结构优化
3、系统配置优化
4、硬件优化
优化数据库
1、使用连接JOIN来代替子查询
2、使用UNION来代替创建临时表
3、事务处理
4、锁表,优化事务
5、建立索引
6、优化SQL语句
索引
索引是一种特殊的文件,他们包含着对数据库所有数据指针引用
普通索引的唯一目的就是加快对数据的访问
普通索引允许索引包含重复的值,如果确定某个列只包含彼此各不相同的值,在为这个数据列创建索引的时候加UNION把它定为唯一性,主键是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于标识一条记录,用primary key来创建
索引也可以覆盖多个列index(columnA,columnB)
索引可以极大提高查询速度,但是会降低插入、删除的速度;