文章目录
- **MySQL索引按照数据结构可以分为哪几类?**
- **一个表中如果没有创建索引,那么还会创建B+树吗?**
- **使用int自增主键后 最大id是10,删除id 10和9,再添加一条记录,最后添加的id是几?删除后重启mysql然后添加一条记录最后id是几?**
- **索引的优缺点是什么?**
- **一条sql发送给mysql后,内部是如何执行的?**
- **MySQL 支持哪些存储引擎?默认使用哪个?**
- 事务
- **什么是事务?**
- **事务的四个特性是什么?**
- **什么是隔离级别?MySQL中有哪些隔离级别?**
- **什么是数据库锁?MySQL中有哪些类型的锁?**
- **什么是死锁?如何避免死锁?**
- **如何在MySQL中开启事务?**
- **如何提交或回滚事务?**
- **什么是脏读?如何避免脏读?**
- **什么是幻读?如何避免幻读?**
- **如何在MySQL中实现乐观锁和悲观锁?**
- **什么是事务的并发控制?MySQL中的并发控制方式有哪些?**
- **什么是事务日志?如何使用事务日志进行数据恢复?**
- **MySQL中的自动提交模式是什么?如何关闭自动提交?**
- **mysql怎么看我的表或者行是否被锁了?**
- **mysql行被锁如何解锁,表被锁如何解锁?**
- **char与varchar的区别?如何选择?**
- **mysql 有一条sql执行很慢,怎么查看原因,怎么解决?**
- **EXPLAIN:**
- **什么是视图?为什么要使用视图?**
- **子查询与join哪个效率高?**
- MySQL和PostgreSQL区别:
MySQL索引按照数据结构可以分为哪几类?
B+树索引、Hash索引、全文索引
一个表中如果没有创建索引,那么还会创建B+树吗?
如果有主键会创建聚簇索引;如果没有主键会生成rowid作为隐式主键
使用int自增主键后 最大id是10,删除id 10和9,再添加一条记录,最后添加的id是几?删除后重启mysql然后添加一条记录最后id是几?
如果没重启,会延续删除之前最大的id开始递增
如果重启,会从最大的id开始递增
索引的优缺点是什么?
优点:加速数据检索:索引可以加速数据检索,使查询结果更快地返回给用户。
减少数据的扫描:使用索引可以减少需要扫描的数据量,从而提高查询效率。
提高查询性能:通过使用索引,数据库可以更快地执行查询操作,从而提高查询性能。
改善数据的完整性:在数据库中创建索引时,可以将索引列设置为唯一,从而强制确保数据的唯一性。
支持高效的排序:使用索引可以更快地排序查询结果。
缺点:占用存储空间:创建索引需要占用存储空间,这可能会导致数据库变得更大。
减缓写操作:每次对表进行更新操作时,索引也需要更新,这会减缓写操作的速度。
不适合小表:对于小表,使用索引可能不会带来明显的性能提升,反而会浪费存储空间。
增加复杂性:在数据库中使用索引会增加一定的复杂性,因为需要考虑索引的创建和维护等问题。
可能会导致查询变慢:如果索引不正确地使用或者过多地使用,可能会导致查询变慢。
一条sql发送给mysql后,内部是如何执行的?
语法分析:MySQL 首先会检查 SQL 语句是否符合语法规则,如果存在语法错误,则会返回错误信息。
权限验证:MySQL 会验证用户是否具有执行该语句的权限,如果没有权限,则会返回错误信息。
查询优化:MySQL 会对查询语句进行优化,选择最优的执行计划。MySQL 使用查询执行计划来确定如何执行 SQL 查询,
并在执行过程中利用缓存等机制来提高执行效率。
数据读取:MySQL 执行查询语句,并从数据库中读取数据。
数据操作:如果是更新、插入或删除数据,MySQL 会对数据进行操作,并更新数据库中的数据。
数据返回:MySQL 将查询结果返回给用户。
MySQL 支持哪些存储引擎?默认使用哪个?
SHOW ENGINES;可以查看MySQL提供什么存储引擎
MySQL中默认使用的存储引擎是InnoDB,支持事务,行锁,外键,支持分布式事务(XA),回滚
事务
什么是事务?
事务是一组数据库操作,这些操作被视为单个逻辑单元,并要么全部成功提交,要么全部回滚。
事务的四个特性是什么?
事务的四个特性通常被称为ACID,即:
Atomicity(原子性):事务被视为一个原子操作,要么全部执行成功,要么全部失败回滚,保证了事务的完整性。
Consistency(一致性):事务的执行使得数据库从一个一致性状态转换到另一个一致性状态,保证了数据的正确性和完整性。
Isolation(隔离性):并发事务之间是隔离的,每个事务执行时看到的数据是独立的,不会相互干扰。
Durability(持久性):一旦事务提交成功,其结果将会持久保存在数据库中,并不会因为系统故障或其他问题而丢失。
什么是隔离级别?MySQL中有哪些隔离级别?
隔离级别指的是在多个事务同时执行时,为了避免并发问题,数据库系统所采取的事务隔离程度。常见的隔离级别包括:
读未提交(Read Uncommitted):事务未提交的修改也可以被其他事务读取。最低的隔离级别,会导致脏读问题。
读已提交(Read Committed):一个事务提交后,其修改才能被其他事务读取。可以避免脏读问题,但可能出现不可重复读问题。
可重复读(Repeatable Read):一个事务执行期间,可以多次读取同一数据,并且始终得到相同结果。
可以避免脏读和不可重复读问题,但可能出现幻读问题。
串行化(Serializable):强制事务串行执行,避免所有并发问题。性能较低,通常只在特殊情况下使用。
什么是数据库锁?MySQL中有哪些类型的锁?
数据库锁是为了协调并发访问数据库时保证数据一致性而引入的一种机制。
当多个事务同时访问同一个数据时,数据库锁可以确保这些事务的操作是有序的,避免数据出现异常。
常见锁:
共享锁(读锁): 允许其他事务也获取该数据的共享锁,但不允许其他事务获取该数据的排他锁。多个事务可以同时持有该数据的共享锁。
排他锁(写锁): 禁止其他事务获取该数据的任何锁,包括共享锁和排他锁。只有该事务可以持有该数据的排他锁。
行级锁: 在行级别上对数据进行加锁,即锁定某一行数据,其他事务只有等待当前事务释放该行的锁才能访问该行数据。
适用于对少量数据进行修改的场景。
表级锁: 在表级别上对数据进行加锁,即锁定整张表,其他事务只能等待当前事务释放该表的锁才能访问该表数据。
适用于对大量数据进行修改的场景。
什么是死锁?如何避免死锁?
死锁指的是两个或多个事务在互相等待对方所持有的资源而陷入无限等待的状态。
例如,事务 A 持有锁 L1,请求锁 L2,而事务 B 持有锁 L2,请求锁 L1,这时两个事务就会相互等待,导致死锁的发生。
避免死锁:
1、表结构,在建表前设计好合理的字段、规则、索引等等。
2、设置一个合适的超时时间,在规定时间内无法获取锁则自动回滚事务。
3、限制事务长度,尽量避免在事务中对多个表进行修改操作。
如何在MySQL中开启事务?
START TRANSACTION; --开启事务
如何提交或回滚事务?
COMMIT; --提交事务
ROLLBACK; -- 回滚事务
什么是脏读?如何避免脏读?
脏读是指在并发访问的情况下,一个事务读取了另一个事务还没有提交的数据,即读取了未提交的数据。脏读可能导致数据的不一致性。
'''
假设有两个事务T1和T2,T1执行一个更新操作,但是未提交事务。
此时T2读取了这个更新的数据,但是此时T1回滚了这个更新操作,T2读取的数据就是错误的。
'''
如何避免?
MySQL提供的四种隔离级别中,只有“读已提交”和“可重复读”级别能够避免脏读问题。
什么是幻读?如何避免幻读?
理解:假设有两个事务T1和T2,T1先执行了一条查询语句,然后T2向数据库中插入了一条新数据。
此时,T1再次执行了相同的查询语句,但是发现结果集中出现了新的一行数据,这个新的行并没有在第一次查询时出现,
因此就像出现了幻觉一样,这种情况就称为幻读。
如何避免:
在“可重复读”隔离级别下,事务在读取数据时会锁定整个数据集,这可以避免幻读问题。
如何在MySQL中实现乐观锁和悲观锁?
乐观锁:
在一个电商系统中,多个用户同时对某个商品进行下单操作,此时可以采用乐观锁机制。
在用户下单时,先读取该商品的库存数量和版本号,并将库存减去用户购买的数量,版本号加1。
如果更新时发现版本号已经被其他事务修改,则说明库存已经被其他用户购买,需要进行回滚或重试操作。
在更新数据时,先检查版本是否一致,若一致则更新成功,否则说明有其他事务修改过数据,需要重新读取数据进行更新。
悲观锁:
在一个银行系统中,多个用户同时对某个账户进行转账操作,此时可以采用悲观锁机制。
在用户进行转账时,先锁定账户,避免其他用户同时对其进行操作。
在转账完成后,释放锁定,让其他用户可以对该账户进行操作。
会在操作资源之前对其进行加锁,其他事务无法直接访问被锁定的资源。
什么是事务的并发控制?MySQL中的并发控制方式有哪些?
事务的并发控制是指在多个事务同时访问数据库时,为了保证数据的一致性和完整性,需要采取一定的措施,
防止出现不正确的结果。常见的并发控制方式有悲观并发控制和乐观并发控制。
并发控制方式:
读未提交(Read Uncommitted): 事务未提交的修改也可以被其他事务读取。最低的隔离级别,会导致脏读问题。
读已提交(Read Committed): 一个事务提交后,其修改才能被其他事务读取。可以避免脏读问题,但可能出现不可重复读问题。
可重复读(Repeatable Read): 一个事务执行期间,可以多次读取同一数据,并且始终得到相同结果。
可以避免脏读和不可重复读问题,但可能出现幻读问题。
串行化(Serializable): 强制事务串行执行,避免所有并发问题。性能较低,通常只在特殊情况下使用。
什么是事务日志?如何使用事务日志进行数据恢复?
记录数据库中已提交的事务的操作的机制。
如何恢复?
1、查找最近的备份文件,并将其还原到MySQL服务器上。
2、备份事务日志:在数据库发生故障之前,应该定期备份事务日志,以便在需要时进行恢复。
3、找到最后一次备份时刻后的事务日志:通过分析数据库故障的时间点,找到最后一次备份时刻之后的事务日志。
MySQL中的自动提交模式是什么?如何关闭自动提交?
在执行每一条SQL语句时,MySQL都会自动提交该语句所做的更改操作,这样一旦执行失败或者执行了不应该执行的语句,就无法回滚操作。
关闭方式:
在连接MySQL时设置参数:在连接MySQL时,在URL中添加参数"autocommit=false"即可关闭自动提交。
连接MySQL后,执行SET语句设置autocommit参数即可关闭自动提交: SET autocommit = 0;
mysql怎么看我的表或者行是否被锁了?
SHOW OPEN TABLES; --查看锁定表信息
SHOW ENGINE INNODB STATUS; --查看锁定状态
mysql行被锁如何解锁,表被锁如何解锁?
UNLOCK TABLES; -- 解锁行锁
showprocesslist;-- 查看造成死锁占用时间长的sql语句
char与varchar的区别?如何选择?
CHAR: 定长字符串类型。
在创建表时,如果使用CHAR类型,则需要指定固定的长度。
例如,如果指定CHAR(10),则该列中存储的字符串长度不足10个字符时,MySQL会自动在后面添加空格字符进行填充。
因为是定长的,所以查询CHAR类型的列的速度比较快,但是对于存储长度不一的数据来说,CHAR类型会浪费存储空间。
varchar:可变长度字符串类型。
在创建表时,需要指定该列能够存储的最大长度,但是存储的实际长度不一定是最大长度。
因为是可变长度的,所以查询VARCHAR类型的列的速度可能会比较慢,但是对于存储长度不一的数据来说,VARCHAR类型可以节省存储空间。
mysql 有一条sql执行很慢,怎么查看原因,怎么解决?
1、查看慢查询日志:MySQL有一个慢查询日志,记录了执行时间超过一定阈值的SQL语句。
命令: SHOW VARIABLES LIKE '%slow_query_log%';
SHOW VARIABLES LIKE '%slow_query_log_file%';
2、使用EXPLAIN命令:使用EXPLAIN命令可以查看MySQL执行SQL语句时使用的查询计划。
EXPLAIN SELECT * FROM table_name WHERE condition;
3、分析查询语句
SET profiling = 1;
执行查询语句:
SHOW PROFILES; -- 停止查询语句分析:
EXPLAIN:
MySQL中用于查询执行计划的命令,
通过分析查询语句,可以获取查询的执行方式、执行顺序、使用的索引、扫描行数等信息,有助于优化查询性能。
使用EXPLAIN的方法是在查询语句前加上EXPLAIN关键字: EXPLAIN SELECT * FROM mytable WHERE column1 = 'value';
通过分析返回结果的信息,可以找到影响查询性能的原因,例如没有合适的索引、查询语句过于复杂等,进而进行优化。
什么是视图?为什么要使用视图?
视图定义:
1、视图是一个虚表,是从一个或几个基本表(或视图)导出的表。
2、只存放视图的定义,不存放视图对应的数据。
3、基表中的数据发生变化,从视图中查询出的数据也随之改变。
视图的作用:
1、视图能够简化用户的操作
2、视图使用户能以多种角度看待同一数据
3、视图对重构数据库提供了一定程度的逻辑独立性
4、视图能够对机密数据提供安全保护
5、适当的利用视图可以更清晰的表达查询
子查询与join哪个效率高?
通常情况下,使用join比使用子查询效率更高,因为join操作可以利用索引来加速查询。
当需要使用子查询时,可以考虑使用“存在”(EXISTS)或“不在”(NOT EXISTS)子查询,因为它们可以利用索引来加速查询。
举个例子
&&查找customer表中的客户及其所有订单&&
使用子查询: SELECT * FROM customer WHERE customer_id IN (
SELECT customer_id
FROM orders
);
使用join: SELECT *FROM customer JOIN orders ON customer.customer_id = orders.customer_id;
MySQL和PostgreSQL区别:
1、数据类型:MySQL和PG支持常见的数据类型,如整数、浮点数、字符串等。
然而,PG还支持更多的数据类型,例如数组、JSON、几何数据等,这使得PG在处理特定类型的数据时更加灵活。
2、复制和高可用性:MySQL和PG都支持数据复制和高可用性架构,但实现方式有所不同。
MySQL使用主从复制,其中一个节点是主节点,负责写操作,而其他节点是从节点,用于读操作。
PG使用流复制,可以实现多个节点之间的数据同步,并且可以进行更灵活的复制拓扑结构。
3、MySQL在处理大量并发读取操作时表现较好,特别适合用于读密集型应用。
PG在处理复杂查询和并发写操作时表现更好,适合用于复杂数据处理和写密集型应用。
MySQL适用于需要高性能读取操作和简单查询的应用,如网站后端、日志分析等。
PG适用于需要复杂查询、高级事务支持和数据类型灵活性的应用,如数据分析、地理信息系统、科学研究等。