mysql_小结之事务
数据库总结:
DML:
lINSERT ( 添加数据语句 ):INSERT INTO 表名 [ ( 字段1, 字段2, 字段3, … ) ] VALUES ( '值1', '值2', '值3', …)
lUPDATE ( 更新数据语句 ) :
UPDATE 表名 SET column_name = value [ , column_name2 = value2, …. ]
[ WHERE condition ];
lDELETE ( 删除数据语句 ):DELETE FROM 表名 [ WHERE condition ];
TRUNCATE [TABLE] table_name
DQL:
SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #联合查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ; #指定查询的记录从哪条至哪条
==================================================================================
逻辑操作符
AND或&& or || xor ~ not !
比较操作符
is null // is not null // between // like // in
like模糊查询
与“%”一起使用,表示匹配0或任意多个字符
与“_”一起使用,表示匹配单个字符
==================================================================================
字符串函数
truncate(sal/30,2) // 保留两位小数
# 名字中不包含R字符的员工信息。
select * from myscott.emp where ENAME not like "%R%";
索引&约束
1. 索引的目的是加快查询速度
2. 主键索引:
(1) 主键通常自带索引
(2) 主键索引同时也是唯一索引
(3) 主键索引也是查询效率最高的索引
(4) 建议大家尽可能使用主键索引
3. 唯一索引
(1) 如果某一列,需要考虑到唯一性,那么可以建索引
(2) 唯一索引建议创建在数值上
4. 常规索引
(1) 最普通的索引
5. 全文检索
(1) 适用于MYISAM数据引擎
(2) 通常是建立在字符串类型的数据上
6. 联合索引:
(1) 不属于索引类型
(2) 是索引的一种应用方法
7. 一般来说,一张表的索引,不超过表列数的24%
8. 非聚集索引:在索引树当中,只保存数据地址,典型的代表MYISAM
9. 聚集索引:索引就是数据,他们二者是在一起的INNERDB
10. 覆盖索引:不需要经过搜索主键索引,直接就能命中目标的索引
SQL优化更偏实际操作经验!!!
索引优化的属性字段:
1. Id/select_type/table:
(1) 判断SQL的执行先后,id相同,由上而下
(2) 判断是那个SQL在执行,id不同,由大自小
2. mysql的二级缓存:已查询sql为KEY,如果已查询数据的数据KEY相同,则直接从缓存中获取数据
3. 执行计划的type
(1) SYSTEM:查询系统内存中的数据,MYISAM中只有一条数据
(2) Const:直接命中(=)主键和唯一索引,是效率最高的索引
(3) Eq_ref:不管是主键还是外键,只要是一对一的关系
(4) Ref:当一对多的情况下,eq_ref会降级为ref
(5) Range:是在索引上的一次范围查询
(6) Index:是在索引上的全表扫描
(7) ALL:不在索引上的全表扫描,至少查2次
+++++plus
possible_keys //索引引擎预估的可能用到的key
执行计划的 key //实际执行中用到的key
执行计划的 rows //越小越好
执行计划的 filtered //filtered 的值越大越好。
索引失效问题:
(1) OR的左右两边都需要有索引,索引才能生效
(2) 联合索引,必须要满足左面最优原则
在索引列上使用内置函数,一定会导致索引失效
优化建议,尽量在应用程序中进行计算和转换。
5. 对索引列进行运算,一定会导致索引失效
优化的话,要把运算放在值上,或者在应用程序中直接算。
6. like通配符可能会导致索引失效
like查询以%开头时,会导致索引失效
7. 联合索引中,where中索引列违背最左匹配原则,一定会导致索引失效
当创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。
8. MySQL优化器的最终选择,不走索引
上面有提到,即使完全符合索引生效的场景,考虑到实际数据量等原因,最终是否使用索引还要看MySQL优化器的判断。
索引优化:
字段类型优化
1. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
2. 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.(备注、描述、评论之类的可以设置为 NULL)
where条件语句优化——针对索引失效进行优化
1. WHERE子句中的连接顺序:数据库采用自右而左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前(左), 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾(右).
2. 避免在where语句中出现字段的类型转换(字段的类型和传入的参数类型不一致的时候发生的隐式类型转换),当两张表字符集不同的时候关联查询
3. 不要在where条件语句中的"="左边进行函数、算数运算或其他表达式运算,可以通过使用冗余字段来替代函数运算,否则系统无法正确使用索引
4. where 子句中对字段进行 null 值判断、包含not、!=、<>等操作符,或like的关键词前加%(like '%关键词'),都无法使用索引,从而引发全表扫描.
5. 使用like进行模糊查询时应注意,除非必要,否则不要在关键词前加%,否则必然导致全表查询
索引本身优化
1. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
2. 用索引提高效率:合理使用索引和复合索引同样能提高效率.但使用索引是有代价的, 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的。
3. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。
4. 要注意索引的维护,周期性重建索引。
分页优化
分页查询的优化。对于:limit 100000 10;
只查询主键select id from table where .. order by .. limit 10000,10(搜索条件和排序请建立索引),再通过主键去获取数据。
事务处理
【1】未提交读:脏读 ---为解决并发问题 【read uncommited】
【2】提交后读:解决脏读,但引入不可重复读 [read committed]
【3】可重复读:解决【2】问题,为解决幻读问题 [repeatable read]
【4】串行化:解决所有问题 [serializable]
=================
查看全局隔离级别:SELECT @@global.tx_isolation;
查看当前会话隔离级别:SELECT @@tx_isolation;
设置全局隔离级别:set global transaction isolation level read committed;
设置当前会话隔离级别:set session transaction isolation level read committed;
当一个事务开启后,如果调用了提交或者回滚,则代表当前事务结束。
唯一索引 && 唯一键
1、唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null。
2、创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。
3、创建一个唯一索引,这个索引就是独立,可以单独删除。
4、如果一个列上想有约束和索引,且两者可以单独的删除。可以先建唯一索引,再建同名的唯一约束。
5、如果表的一个字段,要作为另外一个表的外键,这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错。