隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(Read uncommitted) | × | × | × |
读已提交(Read committed) | √ | × | × |
可重复读(Repeatable Read)(MySQL中默认隔离级别) | √ | √ | × |
串行化(Serializable) | √ | √ | √ |
脏读: 一个事务读取到另一个事务尚未提交的数据。 事务 A 读取事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据。
不可重复读: 一个事务中两次读取的数据的内容不一致。 事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果不一致。
幻读: 一个事务中两次读取的数据量不一致。 系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
B树索引(B-Tree Index):
哈希索引(Hash Index):
查询类型错误:当查询条件中的数据类型与索引列的数据类型不一致时,可能会发生隐式转换,导致索引失效 。
索引列参与运算:如果索引列参与了计算或函数操作,如height + 1 > 189,索引将无法被使用。
错误使用通配符:在使用LIKE语句时,如果通配符%位于字符串的开头,如%keyword,索引将不会被使用 。
OR连接无索引字段:当使用OR连接多个条件,且其中一个条件的列没有索引时,索引可能会失效 。
未用到覆盖索引:如果查询中没有使用覆盖索引,即查询的列不完全包含在索引中,索引将不会被使用 。
联合索引失效:在使用联合索引时,如果查询条件没有包含索引的最左列,索引将不会生效 。
索引列参数使用函数:当索引列作为函数的参数时,可能会使索引失效 。
类型隐式转换:如果参数类型与索引列的类型不匹配,可能会导致类型隐式转换,从而使得索引失效 。
比较两个列:在查询条件中比较两个列的值,如id > age,可能会导致索引失效 。
使用IS NOT NULL:使用IS NOT NULL作为查询条件可能会导致索引失效 。
使用NOT IN和NOT EXISTS:这些条件可能会导致索引失效,尤其是当子查询返回大量行时。
ORDER BY导致索引失效:在某些情况下,使用ORDER BY和LIMIT可能会导致索引失效,尤其是当排序列不是索引的一部分时 。
索引失效的其他原因:包括MySQL优化器的决策,如在某些情况下,优化器可能认为全表扫描比使用索引更快,因此放弃使用索引 。
识别高频查询:首先识别频繁执行且消耗大量资源的查询。这些查询通常涉及大量数据的过滤、排序或连接。通过针对这些查询进行优化,可以实现显著的性能提升 。
选择合适的索引列:根据查询中的WHERE、ORDER BY和JOIN子句使用情况选择索引列。经常用于搜索条件或排序的列应优先考虑索引,以加速数据检索 。
避免过度索引:虽然索引可以提高查询性能,但过度索引会消耗存储空间,并增加数据修改操作的开销。因此,避免在很少用于查询或选择性低的列上创建索引 。
利用复合索引:复合索引(多列索引)在涉及多个过滤条件或排序标准的查询中特别有用。通过在查询中经常一起使用的列上创建复合索引,可以优化查询性能并减少索引开销 。
监控索引使用和性能:定期使用MySQL内置的监控工具(如性能模式和慢查询日志)监控索引的使用和性能。识别利用率低的索引、未使用的索引以及导致性能瓶颈的索引,并相应调整索引配置以优化查询性能 。
考虑索引数据类型:为索引列选择合适的数据类型,以最小化索引大小并优化查询性能。对于数值列使用整数数据类型,对于可变长度字符串使用VARCHAR数据类型,对于日期和时间列使用DATE或DATETIME数据类型。除非必要,否则避免对大型文本或二进制数据类型的列进行索引 。
定期分析和优化索引:使用MySQL的ANALYZE TABLE和OPTIMIZE TABLE命令定期分析索引的使用情况、碎片化和效率。这些命令有助于识别和解决索引碎片化、过时统计信息和低效索引结构的问题,从而优化查询性能并维护数据库健康 。
使用覆盖索引:覆盖索引是一种特殊类型的索引,它包含了查询所需的所有列,从而避免了访问实际表的需要。这可以显著减少磁盘I/O并提高查询执行时间 。
考虑使用部分索引:部分索引用于索引表中的特定行子集,从而减少索引大小并提高特定数据子集的查询性能 。
监控和维护索引:定期检查索引碎片并重新组织或重建索引,以帮助减少磁盘I/O并提高查询性能 。
视图是在数据库中定义的虚拟表。它是一个基于一个或多个实际表的查询结果集,可以像实际表一样被查询和操作。视图可以看作是一个动态生成的数据表,其内容是从其他表中选择、过滤和计算得到的。
约束是表级的强制规定。可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过 ALTER TABLE 语句规定约束。
防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制
存储过程:一组预编译的 SQL 语句,用于执行复杂的操作。它可以接收输入参数,并返回输出参数或结果集。
函数:一种特殊类型的存储过程,它只返回一个标量值(单个数据值)。
返回值:
存储过程可以返回多个值(通过输出参数)或结果集。
函数只能返回单个标量值。
事务控制:
存储过程通常在事务中执行,这意味要么所有语句都成功执行,要么整个事务回滚。
副作用:
存储过程通常具有副作用,例如更新或插入数据。
函数通常没有副作用,并且只返回一个值。
可重用性:
存储过程和函数都可以在多次查询中重用。
不过,函数通常比存储过程更易于重用,因为它们只返回一个值。
性能:
存储过程通常比函数性能更好,因为它们是预编译的。
但是,如果函数只执行简单的计算,则它可能比存储过程更快。
选择标准:
如果需要执行复杂的操作,具有副作用并且需要返回多个值,则使用存储过程。
如果只需要返回单个标量值并且没有副作用,则使用函数。
水平分区是把数据分散到多个表中,表的字段都一致,数据不同
例如:可以根据时间范围(如每年的数据)或地理区域(如每个城市的数据)来分区。水平分区的常见模式包括:
垂直分区是把一张表拆分成多个表,表的字段不一致,数据一致
垂直分区是根据列的属性来分割表。这种分区模式下,每个分区包含的是表中的不同列,而行数保持不变。通常,垂直分区将频繁访问的列和不常访问的列分开,以优化查询性能和减少读取磁盘的数据量。
例如:可以将一个包含大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就可以把这些不经常使用的text和BLOB列划分到另一个分区。
分区的优势和限制
优势:提高查询性能,减少需要搜索的数据量;数据管理更加灵活,可以独立地备份、恢复或优化某个分区;提高数据备份/恢复等操作的效率。
限制:如果不当使用,可能会对性能产生负面影响;需要更多的内存和磁盘空间来维护索引、统计信息和其他元数据;对于跨分区的查询,可能需要额外的连接操作,这可能会导致性能问题。
如果不在C:\Program Files目录下,那么在C:\ProgramData\MySQL\MySQL Server 8.0目录下可以找到data目录和ini配置文件
如果因为密码插件问题无法登录,可以尝试在命令行输入以下语句
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_Native_password BY 'root';
将mysql的密码插件从caching_sha2_password修改为mysql_native_password
数据库系统是一个包含硬件、软件和数据的完整体系,而数据库管理系统是这个体系中负责数据操作和管理的软件部分。
navicat是数据库管理系统人机交互界面,不是数据库管理系统
mysql是数据库管理系统