mysql工作中怎么用 mysql使用流程( 三 )


假如删除记录报错:[Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)
这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据 。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况 。第一步:禁用外键约束 , 我们可以使用:SETFOREIGN_KEY_CHECKS=0;第二步:删除数据 第三步:启动外键约束,我们可以使用:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值 , 可用如下命令:SELECT @@FOREIGN_KEY_CHECKS;
使用UNION 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行 。
每个查询必须包含相同的列、表达式和聚集函数 。
默认会去除相同行,如果需要 保留 相同行 , 使用 UNION ALL。
只能包含一个ORDER BY子句,并且必须位于语句的最后。
内置函数很多, 见: MySQL 函数
我们一般使用START TRANSACTION 或 BEGIN 开启事务,COMMIT 提交事务中的命令,SAVEPOINT : 相当于设置一个还原点,ROLLBACK TO : 回滚到某个还原点下
一般的使用格式如下:
开启事务时, 默认加锁
根据类型可分为共享锁(SHARED LOCK)和排他锁(EXCLUSIVE LOCK)或者叫读锁(READ LOCK)和写锁(WRITE LOCK) 。
根据粒度划分又分表锁和行锁 。表锁由数据库服务器实现,行锁由存储引擎实现 。
除此之外,我们可以显示加锁
加锁时,如果没有索引,会锁表,如果加了索引 , 就会锁行
InnoDB默认支持行锁,获取锁是分步的,并不是一次性获取所有的锁,因此在锁竞争的时候就会出现死锁的情况
解决方法:
即ACID特性:
由于并发事务会引发上面这些问题, 我们可以设置事务的隔离级别解决上面的问题.
MySQL的默认隔离级别(可重复读)
查看当前会话隔离级别
方式1
方式2
设置隔离级别
主从集群的示意图如下:
主要涉及三个线程:binlog线程、 I/O线程和SQL线程 。
同步流程:
由于MySQL主从集群只会从主节点同步到从节点, 不会反过来同步, 所以需要读写分离
读写分离需要在业务层面实现, 写数据只能在主节点上完成, 而读数据可以在主节点或从节点上完成
索引是帮助MySQL高效获取数据的排好序的数据结构
MySQL的索引有
推荐两个在线工具:
简单来说, B树是在红黑树(一个平衡二叉树)的基础上将一个节点存放多个值, 实现的, 降低了树的高度, 每个节点都存放索引及对应数据指针, 同一层的节点是递增的
而B+树在B树的基础上进行优化, 非叶子节点存放 子节点的开始的索引, 叶子节点存放索引和数据的指针, 且叶子节点之间有双向的指针
如下示意图:
不同的引擎, 主键索引存放的数据也不一样, 比如常见的MyISAM 和 InnoDB
MyISAM 的B+树叶子节点存放表数据的指针,InnoDB 的B+树叶子节点存放处主键外的数据
其他的:
即多个列组成一个索引, 语法:
由于联合索引的B+树的结构, 根据列建立, 所以我们的查找条件也要根据索引列的顺序(where column1=x, column2=y,columnN... ), 否则会全表扫描
如果你对列进行了(+,- , * , /,!) , 那么都将不会走索引 。
OR 引起的索引失效
OR 导致索引是在特定情况下的,并不是所有的 OR 都是使索引失效,如果OR连接的是 同 一个字段,那么索引 不会失效  ,  反之索引失效。
这个我相信大家都明白,模糊搜索如果你前缀也进行模糊搜索,那么不会走索引 。
这两种用法 , 也将使索引失效 。另IN 会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描, 见: MySQL中使用IN会不会走索引

推荐阅读