赞
踩
数据库(Database)是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。(简而言之,用来存储大量数据的)
使用数据库可以方便地存储和管理大量数据,并且可以通过查询等方式快速地获取和操作数据,提高数据的可靠性和安全性。
MySQL是一种关系型数据库管理系统,它使用SQL语言进行查询和管理数据。它是一种开源软件,可以在多个操作系统上运行。
这些范式旨在规范数据库设计,以确保数据的一致性、完整性和有效性。
binlog 有三种格式
在数据中,索引相当于字典的目录一下,通过索引可以快速的检索数据。
优点:
缺点:
就是把无序的数据变成有序的查询.
查询更快、占用空间更小
对于经常需要搜索、排序或分组的列,应该创建索引。这样可以加快查询速度。
对于表中唯一值比较多的列,也应该创建索引。这些列通常是主键、外键和唯一约束列。
避免在大型表上创建过多的索引。因为索引会占用磁盘空间,并且会影响插入、更新和删除操作的性能。
对于经常进行范围查询的列,如日期或价格,应该使用复合索引。复合索引可以包含多个列,可以提高查询性能。
在创建索引时,应该选择合适的数据类型和长度。选择较小的数据类型和长度可以减少索引占用的磁盘空间,并提高查询性能。
定期对索引进行优化和维护。可以使用数据库管理工具或脚本来分析索引使用情况,并进行必要的优化和维护操作。
通常,通过索引查询数据比全表扫描要快。但是我们也必须注意到它的代价。
索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4 5次的磁盘I/O。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
分批次删除:将要删除的数据分成多个批次,每次删除一部分数据。这样可以避免一次性删除过多数据导致数据库性能下降或者系统崩溃。
使用TRUNCATE命令:TRUNCATE命令可以快速删除表中的所有数据,比使用DELETE命令要快得多。但是,TRUNCATE命令不能回滚数据,所以在使用之前需要谨慎考虑。
使用DROP命令:DROP命令可以删除整个表,包括表结构和所有数据。但是,这个方法需要谨慎使用,因为它会永久删除数据,而且无法恢复。
使用存储过程:可以编写存储过程来删除数据。存储过程可以对数据进行预处理和批量删除,可以提高删除效率。
使用分区表:如果表中的数据可以按照某个条件进行分区,可以使用分区表来删除数据。这样可以只删除指定分区中的数据,而不会影响其他分区的数据。
无论采用哪种方法,都需要在删除之前备份数据,并在删除之后进行必要的优化和维护操作。
顾名思义,最左优先,以最左边为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
如建立 (a,b,c,d) 索引,查询条件 b = 2 是匹配不到索引的,但是如果查询条件是 a = 1 and b = 2 或 a=1 又或 b = 2 and a = 1 就可以,因为优化器会自动调整 a,b 的顺序。
再比如 a = 1 and b = 2 and c > 3 and d = 4,其中 d 是用不到索引的,因为 c 是一个范围查询,它之后的字段会停止匹配。
数据库事务是指一组数据库操作,这组操作要么全部执行成功,要么全部执行失败。在数据库中,事务通常用于保证数据的一致性和完整性。
事务通常具有以下四个特性,也称为ACID特性:
原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部执行失败。如果其中任何一个操作失败,整个事务都会被回滚到之前的状态。
一致性(Consistency):事务执行前后,数据库的状态应该保持一致。也就是说,事务执行后,数据库应该满足所有的约束和规则。
隔离性(Isolation):事务应该在独立的隔离环境中运行,不受其他事务的干扰。这可以避免数据冲突和并发问题。
持久性(Durability):事务执行成功后,对数据库的修改应该被永久保存。即使系统崩溃或者重启,数据也应该能够恢复。
通过使用事务,可以确保数据库操作的正确性和可靠性。如果一个操作失败,整个事务都会被回滚到之前的状态,这可以避免数据损坏和数据不一致的问题。
FROM子句:从指定的表中获取数据。
WHERE子句:筛选满足条件的数据行。
GROUP BY子句:将数据按照指定的列进行分组。
HAVING子句:筛选满足条件的分组。
SELECT子句:选择需要查询的列。
DISTINCT关键字:去除重复的行。
ORDER BY子句:对结果集进行排序。
LIMIT子句:限制结果集的数量。
需要注意的是,这些步骤并不是严格按照顺序执行的,而是根据具体情况进行优化和调整的。例如,如果查询中使用了聚合函数,那么GROUP BY子句会在WHERE子句之后执行。同时,数据库系统也会根据索引和其他优化策略来调整执行顺序,以提高查询性能。
因此,虽然SELECT语句的执行顺序是按照上述步骤进行的,但是实际执行过程中可能会有所不同。
事务通常具有以下四个特性,也称为ACID特性:
原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部执行失败。如果其中任何一个操作失败,整个事务都会被回滚到之前的状态。
一致性(Consistency):事务执行前后,数据库的状态应该保持一致。也就是说,事务执行后,数据库应该满足所有的约束和规则。
隔离性(Isolation):事务应该在独立的隔离环境中运行,不受其他事务的干扰。这可以避免数据冲突和并发问题。
持久性(Durability):事务执行成功后,对数据库的修改应该被永久保存。即使系统崩溃或者重启,数据也应该能够恢复。
脏读:一个事务读取到另一个事务尚未提交的数据。 事务 A 读取事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据。
不可重复读:一个事务中两次读取的数据的内容不一致。 事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果 不一致。
幻读:一个事务中两次读取的数据量不一致。 系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
程序开发过程中不注意书写规范写SQL语句和关键字未进行过滤,导致客户端可以通过全局变量get或者post提交sql语句到服务器端正常运行;
防止方法:
视图是一种虚拟表,它是由 SELECT 语句定义的。视图不像表那样实际存在于数据库中,而是在需要时动态生成的结果集。视图可以看作是一张虚拟表,它可以从一个或多个基本表中选择、过滤和排序数据,生成一个新的逻辑表。
使用视图的主要原因如下:
简化复杂查询:视图可以将多个表的数据组合成一个逻辑表,从而简化复杂查询。这样就不需要编写复杂的 SQL 查询语句,而是可以使用简单的 SELECT 语句查询视图。
限制数据访问:通过视图,可以限制用户对表中某些列的访问权限,从而保护敏感数据不被随意访问和修改。这种方式可以保证数据的安全性。
简化数据操作:通过视图,可以将多个表的数据组合起来,形成一个逻辑上的表,使得查询和操作数据更加方便。这样就可以避免在查询和操作数据时需要编写复杂的 SQL 查询语句。
提高数据一致性:通过视图,可以对数据进行约束和验证,保证数据的一致性和完整性。这种方式可以避免用户在操作数据时出现错误。
优点:
缺点:
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
优点:
缺点:
死锁是指两个或多个事务在执行过程中,因为互相持有对方需要的资源而相互等待,从而导致无法继续执行的情况。这种情况下,每个事务都在等待对方释放资源,而自己又无法释放自己持有的资源,从而导致整个系统陷入僵局。
解决死锁的方法主要有以下几种:
超时机制:在事务等待资源的过程中,设置一个超时时间。如果在规定时间内没有得到需要的资源,就放弃等待并回滚事务。
死锁检测和解除:系统可以定期检测是否存在死锁,并尝试解除死锁。一旦发现死锁,系统就会选择一个事务进行回滚,从而解除死锁。
加锁顺序:在进行资源加锁时,可以规定所有事务必须按照同一顺序进行加锁。这样可以避免不同事务之间的加锁顺序不一致,从而导致死锁的产生。
减少事务持有资源的时间:尽可能地减少事务持有资源的时间,可以减少死锁的发生概率。
使用读写锁:对于读多写少的应用场景,可以使用读写锁来提高并发性能。读写锁允许多个事务同时读取同一个资源,但只允许一个事务进行写操作。
左连接会读取左边数据表的全部数据,即使右边数据表没有对应数据。如果两个表中数据有相同部分,只显示一个数据
右连接会读取右边数据表的全部数据,即使左边数据表没有对应数据。如果两个表中数据有相同部分,只显示一个
select * from 表名 group by 列明 having 条件
select top 100 * from 表名 order by 列名 desc (升序asc 降序desc)
多表联查:select * from 表1 join 表2 on 表1.列=表2.列(列里的字段一样)
select * from 表1 a join 表2 b on a.id=b.id(id相同)
内连接:select * from 表1 a inner join 表2 b on a.id=b.id
左连接:select * from 表1 a left join 表2 b on a.id=b.id
右链接:select * from 表1 a right join 表2 b on a.id=b.id
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。