MYSQL常用操作
MYSQL常用操作
1 基本概念
mysql的事务是什么
在数据库中,事务(Transaction)是一组操作单元,这些操作单元要么全部执行成功,要么全部执行失败。事务是保证数据库一致性的重要机制之一,它可以将一系列的操作看作一个整体,从而保证数据库的完整性和正确性。
事务具有四个特性,即ACID:
原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部执行失败,不会出现部分执行的情况。
一致性(Consistency):事务执行前后数据库的状态是一致的,即数据库中的约束和规则都得到了保持。
隔离性(Isolation):多个事务并发执行时,相互之间不会影响彼此的执行结果。
持久性(Durability):事务执行完成后,对数据库所作的修改将被永久保存到数据库中。
MySQL是一种常见的关系型数据库,支持事务的机制。在MySQL中,事务可以
通过使用事务控制语句(Transaction Control Statements)来进行管理,包括以下三个语句:
START TRANSACTION:开始一个事务。
COMMIT:提交一个事务,使之生效。
ROLLBACK:回滚一个事务,使之失效。
在MySQL中,事务默认是关闭的,需要通过设置autocommit参数为0来启用事务。启用事务后,可以通过执行SQL语句来进行事务操作,
数据库的事务的4个特性是什么?并发事务会带来什么问题?
- 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
- 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
- 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
- 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
并发事务的问题:
- 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
- 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
- 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
- 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
事务隔离的级别:
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。(MySQL默认)
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
一条语句,问怎么加索引比较好?什么情况应该加索引,什么情况不应该加?
在 MySQL 中,创建索引可以提高查询性能。为了给某个列添加索引,我们可以使用以下语句:
CREATE INDEX index_name ON table_name(column_name);
在这里,index_name是你为索引指定的名称,table_name是你要添加索引的表名,而column_name是你要添加索引的列名。
在选择要添加索引的列时,请考虑以下几点:
对于经常用于查询条件的列,添加索引可以提高查询速度。
对于具有许多重复值的列,添加索引的性能提升可能不明显。
尽量避免在非常大的表上创建过多索引,因为这会影响插入和更新操作的性能。
2 数据库操作
字符集切换
1 | set names utf8; |
知道字段名,反查在哪张表
1 | select table_name from information_schema.columns where table_schema = '库名' and column_name='字段名'; |
知道表名,反查在哪个库里
1 | SELECT table_schema FROM information_schema.TABLES WHERE table_name = '表名'; |
修改表名
1 | rename table MyClass to YouClass; |
备份表
1 | mysqldump -h10.18.110.12 -umysql_user -pmysql_passwd -P22001 tgwoss_apd tb_isp > tb_isp.sql |
导出数据库
1 | 导出整个数据库结构和数据 |
建议用online ddl
(网上可以查)修改,就是逗号后面的参数
另外,添加字段要加上after,根据表结构看看fromWanIp适合在哪个字段后
ALTER TABLE cEip ALTER COLUMN ispId SET DEFAULT -1, ALGORITHM=INPLACE, LOCK=NONE;