mysql数据库重点(基础优化)

### Mysql性能优化


尽可能不要写select * ,若是须要全表数据,使用select 加全部字段列名称查询代替*
尽可能减小字段列的数学计算,如:where num * 2 >= 30,可改成 where num >= 30/2

学会使用 explain 关键字 查看当前sql语句的优化程度
例如:
explain select * from emp where ename = "孙悟空"
table : 表名
type : 链接类型,从最差到最好分为 all(查询全部)、range(查询知足条件的)、 const(只有一条结果)。尽可能不要用all类型的查询语句
key :索引名,若是该列没有索引,则为null
key_len : 索引长度,越短越好
rows : 扫描行数,该值是个预估值
extra : 详细说明,常见不太友好的值。以下:Using filesort ,Using temporary

一、当只要一行数据时使用 limit 1
表示只要第一页 第一条 数据,使用场景:
查询时已知会获得一条数据,这种状况下加上 limit 1 能够提升查询性能。由于mysql 数据库引擎会在找到第一条结果中止搜索,而不是继续查询下一条是否符合条件直到查询完全部数据

二、选择正确的数据库引擎
MyISAS、InnoDB
MyISAS 适合大量查询的应用。若是有 update语句,会锁住整张表,直到结束才能执行其余查询操做。
InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB 是默认的 MySQL引擎。

三、索引添加
对于常常用来查询的字段,应该为它创建索引。提升以该字段为搜索条件的查询效率
添加方式:
1.添加PRIMARY KEY(主键索引):
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

2.添加UNIQUE(惟一索引) :
ALTER TABLE `table_name` ADD UNIQUE ( `column` )

3.添加INDEX(普通索引) :
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

4.添加FULLTEXT(全文索引) :
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)

5.添加多列索引:
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

四、表建立
表关系
一对一
一对多:
一的一方:主表
多的一方:从表
外键:须要在从表新建一列做为外键,他的取值来源主表的主键
多对多:
中间表:中间表中最少应该由两个字段组成,这两个字段做为外键指向两张表的主键,又组成了联合主键。
在相对不严谨的项目中通常咱们不建立表之间的关联(不使用外键关联)。都是使用代码控制他们逻辑上的关系。
 
五、数据库尽量的使用 NOT NULL 填充
由于 select id from t where num is null 这样的 sql 也是能够的
Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列须要更多的存储空间,还须要mysql内部进行特殊处理。可空列被索引后,每条记录都须要一个额外的字节,还能致使MYisam 中固定大小的索引变成可变大小的索引
注意:但把NULL列改成NOT NULL带来的性能提示很小,除非肯定它带来了问题,不然不要把它当成优先的优化措施,最重要的是使用的列的类型的适当性

六、13.2 select * from admin left join log on admin.admin_id = log.admin_id where log.admin_id>10 如何优化? ?
优化为: select * from (select * from admin where admin_id>10) T1 lef join log on T1.admin_id =log.admin_id。
使用 JOIN 时候,应该 用小的结果驱动大的结果(left join 左边表结果尽可能小若是有条件应该放到左边先处理,
right join 同理反向),同时尽可能把牵涉到多表联合的查询拆分多个 query(多个连表查询效率低,容易到以后锁表和
阻塞)
 
七、limit 的基数比较大时使用 between
例如:select * from admin order by admin_id limit 100000,10
优化为:select * from admin where admin_id between 1000000 and 1000010 order by admin_id。

八、尽可能避免在列上作运算,这样致使索引失效
例如:select * from admin where year(admin_time)>2014
优化为: select * from admin where admin_time> '2014-01-01′

### Mysql 事务

一、事务的介绍
Transaction
事务只和DML(增删改)语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不一样,DML语句的个数不一样
在mysql 中事务是自动提交的,由于单条语句执行成功是自动提交的
事务支持。开启、提交、回滚

二、事务的四大特性
原子性(A):事务是最小单位,不可再分
一致性(C):事务要求全部的DML语句操做的时候,必须保证同时成功或者同时失败
隔离性(I):事务A和事务B之间具备隔离性
持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)

* 事务四大特性之一————隔离性(isolation)
事物A和事物B之间具备必定的隔离性
隔离性有隔离级别(4个)
读未提交:read uncommitted
读已提交:read committed
可重复读:repeatable read
串行化:serializable

一、 read uncommitted 读未提交
- 事物A和事物B,事物A未提交的数据,事物B能够读取到
- 这里读取到的数据叫作“脏数据”
- 这种隔离级别最低,这种级别通常是在理论上存在,数据库隔离级别通常都高于该级别

二、read committed 读已提交
- 事物A和事物B,事物A提交的数据,事物B才能读取到
- 这种隔离级别高于读未提交
- 换句话说,对方事物提交以后的数据,我当前事物才能读取到
- 这种级别能够避免“脏数据”
- 这种隔离级别会致使“不可重复读取”
- Oracle默认隔离级别

三、repeatable read 可重复读
- 事务A和事务B,事务A提交以后的数据,事务B读取不到
- 事务B是可重复读取数据
- 这种隔离级别高于读已提交
- 换句话说,对方提交以后的数据,我仍是读取不到
- 这种隔离级别能够避免“不可重复读取”,达到可重复读取
- 好比1点和2点读到数据是同一个
- MySQL默认级别
- 虽然能够达到可重复读取,可是会致使“幻像读”

四、serializable 串行读
- 事务A和事务B,事务A在操做数据库时,事务B只能排队等待
- 这种隔离级别不多使用,吞吐量过低,用户体验差
- 这种级别能够避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发
相关文章
相关标签/搜索