Mysql 性能优化
- 1、 当只要一行数据时使用 limit 1
查询时如果已知会得到一条数据,这种情况下加上 limit 1 会增加性能。因为 mysql 数据库引
擎会在找到一条结果停止搜索,而不是继续查询下一条是否符合标准直到所有记录查询完毕。 - 2、 选择正确的数据库引擎
Mysql 中有两个引擎 MyISAM 和 InnoDB,每个引擎有利有弊。
MyISAM 适用于一些大量查询的应用,但对于有大量写功能的应用不是很好。甚至你只需要
update 一个字段整个表都会被锁起来。而别的进程就算是读操作也不行要等到当前 update 操作完
成之后才能继续进行。另外, MyISAM 对于 select count(*)这类操作是超级快的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用会比 MyISAM 还慢,但是支
持“行锁”,所以在写操作比较多的时候会比较优秀。并且,它支持很多的高级应用,例如:事务。 - 用 not exists 代替 not in
Not exists 用到了连接能够发挥已经建立好的索引的作用, not in 不能使用索引。 Not in 是最
慢的方式要同每条记录比较,在数据量比较大的操作红不建议使用这种方式。 - 对操作符的优化,尽量不采用不利于索引的操作符
如: in not in is null is not null <> 等
某个字段总要拿来搜索,为其建立索引:
Mysql 中可以利用 alter table 语句来为表中的字段添加索引,语法为: alter table 表明
add index (字段名);
Mysql存储引擎
(1)、 InnoDB 存储引擎
InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键, InnoDB 是默认的 MySQL
引擎。(2)、 MyISAM 存储引擎
MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一。 MyISAM 拥有较高的插入、查询速度,但不支持事物。(3)、 MEMORY 存储引擎
MEMORY 存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。(4)、 NDB 存储引擎
DB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC,但它是 Share Nothing 的架构,因此能提供更高级别的高可用性和可扩展性。 NDB 的特点是数据全部放在内存中,因此通过主键查找非常快。
关于 NDB,有一个问题需要注意,它的连接(join)操作是在 MySQL 数据库层完成,不是在存储引擎层完成,这意味着,复杂的 join 操作需要巨大的网络开销,查询速度会很慢。(5) 、 Memory (Heap) 存储引擎
Memory 存储引擎(之前称为 Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。(6) 、 Archive 存储引擎
正如其名称所示, Archive 非常适合存储归档数据,如日志信息。它只支持 INSERT 和 SELECT 操作,其设计的主要目的是提供高速的插入和压缩功能。(7) 、 Federated 存储引擎
Federated 存储引擎不存放数据,它至少指向一台远程 MySQL 数据库服务器上的表,非常类似于 Oracle 的透明网关。(8)、 Maria 存储引擎
Maria 存储引擎是新开发的引擎,其设计目标是用来取代原有的 MyISAM 存储引擎,从而成为 MySQL 默认
的存储引擎。
上述引擎中, InnoDB 是事务安全的存储引擎,设计上借鉴了很多 Oracle 的架构思想,一般而言,在 OLTP应用中, InnoDB 应该作为核心应用表的首先存储引擎。 InnoDB 是由第三方的 Innobase Oy 公司开发,现已被Oracle 收购,创始人是 Heikki Tuuri,芬兰赫尔辛基人,和著名的 Linux 创始人 Linus 是校友。
Mysql事务
MySQL 和其它的数据库产品有一个很大的不同就是事务由存储引擎所决定,例如MYISAM,MEMORY,ARCHIVE都不支持事务,而InnoDB引擎就支持事务。
事务就是为了解决一组查询要么全部执行成功,要么全部执行失败。
事务的四大特性(ACID)
通常人们口中的四大特性解释
- 原子性(Atomicity ) 回滚 要么全部成功,要么全部失败
- 一致性(Correspondence ) 转账 500 500 -> 600 400
- 隔离性(Isolation ) 多个线程操作数据库,是相互隔离的,对T1线程,要么T2线程已经结束,要么T2线程还没开始 可设置隔离级别
- 持久性(Durability ) 事务一旦提交,就会永久性改变数据库中的数据,即使数据库系统故障也不会丢失数据
乐优商城中的四大特性解释
事务的四大特性:ACID
Atomic(原子性), Consistency(一致性) , IsoLation(隔离性) , Durability(持久性)
- 原子性:在一个事务中,如果有多个操作,要么都成功,要么都失败,不可分割。
- 一致性:在一个事务中,多个操作,前面的操作成功了,后面的操作失败了,则要把前面的操作回滚,达到一致性。
- 隔离性:多个事务之间不会相互影响。
- 持久性:事务一旦开启,则持久持续执行,不能中途中止。
事务的隔离级别(4种)
为了解决事务并发执行的问题
事务并发执行的问题:
- 脏读:T1修改AGE的值从20到30,T2读取到更新的值30,T1事务内其他地方放生异常回滚AGE变为20,T2读取到的30是无效值,由于其他事务的回滚导致另外的事务读取到了错误的值。
- 不可重复读:T1读取AGE值为20,T2将AGE修改为30,T1再次读取AGE的值为30,一个事务内前后读取数据不一致
- 幻读:T1读取STU表中一部分数据,T2向STU表中插入了新的行,T1再次读取STU表时,多读出了一些行,一个事务内前后读取数据不一致。
由于事务的并发执行问题,引出解决方案:事务的隔离级别:
串行化 (解决幻读,不可重复读,脏读) 数据库执行效率会变低
读已提交 (解决幻读,不可重复读) Oracle默认隔离级别 常用 isolation=Isolation.READ_COMMITTED
可重复读 (解决幻读) Mysql默认隔离级别
串行化 (不能解决问题)
事务的传播行为(7种)
多个事务嵌套执行时,事务如何传播
最常用的两种
1
2 > (propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
>
- REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行。
- REQUIRES_NEW:当前的方法必须启动新事物,并在它自己的事物内运行,如果有事务正在运行,应该将它挂起。
SQL之聚合函数
聚合函数是对一组值进行计算并返回单一的值的函数,它经常与 select 语句中的 group by 子句一同使
用。
- a. avg():返回的是指定组中的平均值,空值被忽略。
- b. count():返回的是指定组中的项目个数。
- c. max():返回指定数据中的最大值。
- d. min():返回指定数据中的最小值。
- e. sum():返回指定数据的和,只能用于数字列,空值忽略。
- f. group by():对数据进行分组,对执行完 group by 之后的组进行聚合函数的运算,计算每一组的值。
最后用having去掉不符合条件的组, having子句中的每一个元素必须出现在select列表中(只针对于mysql)。
in()适合B表比A表数据小的情况
exists()适合B表比A表数据大的情况