常见服务知识点罗列--mysql

本文介绍了MySQL中的关键概念,包括索引类型与工作机制、存储引擎的区别、事务的ACID特性,以及如何通过多种策略进行数据库优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、原理
(1)有哪几种索引?
  1. 普通索引: 即针对数据库表创建索引
  2. 唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值必须唯一,但允许有空值
  3. 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
  4. 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。
索引工作机制:

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

(2)存储引擎

MyISAM:
InnoDB:5.5后默认

mysql 中 myisam 与 innodb 的区别?
  1. 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

  1. InnoDB 支持行级锁,而 MyISAM 支持表级锁.

用户在操作myisam 表时,select,update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。

  1. InnoDB 支持 MVCC, 而 MyISAM 不支持
  2. InnoDB 支持外键,而 MyISAM 不支持
  3. 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

  1. InnoDB 不支持全文索引,而 MyISAM 支持。
  2. 可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了

  1. 存储结构

MyISAM:每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。

(3)事务

事务Transactions:一组原子性的SQL语句,或一个独立工作单元
事务日志:记录事务信息,实现undo,redo等故障恢复功能

ACID特性:

A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发
D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

2、命令
linux上登录mysql命令:mysql -uroot -p
列出所有数据库:show database;
进入某数据库:use databasename;
列出数据库中所有表:show tables;
3、架构

MHA一主两从

MHA工作原理/主从复制原理
  1. 从宕机崩溃的master保存二进制日志事件(binlog events)
  2. 识别含有最新更新的slave
  3. 应用差异的中继日志(relay log)到其他的slave
  4. 应用从master保存的二进制日志事件(binlog events)
  5. 提升一个slave为新的master
  6. 使其他的slave连接新的master进行复制
4、数据备份机制

完全备份
部分备份
增量备份
差异备份

冷备
热备
温备

物理备份
逻辑备份

cp、tar:
快照:
mysqldump:
xtrabackup:
mysqlbackup:

5、优化
mysql优化

1.用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。
2.有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。
3.表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
4.UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用 UNION ALL。

UNION 和 UNION ALL 关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1.对重复结果的处理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除重复记录。
2.对排序的处理:Union 将会按照字段的顺序进行排序;UNION ALL 只是简单的将两个结果合并后就返回。

尽量使用可正确存储数据的最小数据类型,简单数据类型的操作通常需要更少的CPU周期;
尽量避免NULL;

SQL语句性能优化

查询时,能不要就不用,尽量写全字段名
大部分情况连接效率远大于子查询
多表连接时,尽量小表驱动大表,即小表 join 大表
在有大量记录的表分页时使用limit
对于经常使用的查询,可以开启缓存
多使用explain和profile分析查询语句
查看慢查询日志,找出执行时间长的sql语句优化

<think>好的,我现在需要回答用户关于MySQL索引的问题。首先,用户之前询问了深度学习的内容,现在转向数据库的索引,可能是在学习技术栈的不同部分。我需要确保回答的结构清晰,覆盖主要知识点,并且符合用户提到的格式要求。 首先,我应该回忆一下MySQL索引的基本概念,然后分门别类地整理知识点常见的索引类型有B+树索引、哈希索引、全文索引等。接下来是索引的数据结构,比如B+树的结构特点,为什么MySQL使用B+树而不是B树或者其他结构。然后要考虑索引的类型,比如主键索引、唯一索引、普通索引、联合索引等,每种索引的区别和应用场景。 另外,需要包括索引的创建和管理,比如创建索引的语法,如何选择索引的列,索引的优化策略,比如最左前缀原则,覆盖索引,索引下推这些概念。还有索引的优缺点,比如提高查询速度但会增加写入开销,占用存储空间等。 还要考虑索引的使用注意事项,比如什么时候应该创建索引,什么时候不应该,如何通过EXPLAIN来分析索引的使用情况,索引的失效场景,比如使用函数、类型转换、OR条件等导致索引失效的情况。 可能还需要提到聚簇索引和非聚簇索引的区别,InnoDB和MyISAM在索引实现上的不同。此外,索引的存储引擎支持情况,比如MEMORY引擎支持哈希索引,InnoDB的自适应哈希索引等。 有没有遗漏的部分?比如索引的维护,比如重建索引,索引的统计信息,Cardinality的概念,以及索引的选择性和查询效率的关系。此外,还有全文索引的特殊处理,比如自然语言模式和布尔模式,以及5.6版本后InnoDB对全文索引的支持。 还有,需要确保使用正确的LaTeX格式,比如数学表达式和公式用$或$$包裹,结构分点明确。需要检查是否有错误的技术细节,比如B+树的高度计算,或者联合索引的最左匹配原则的具体例子。 可能还需要举例说明,比如创建索引的SQL语句,如何查看索引信息,使用EXPLAIN的结果解读。但用户可能只需要知识点罗列,不需要具体例子,但适当举例有助于理解。 最后,总结部分可以提到索引的最佳实践,比如避免过多索引,定期分析索引使用情况,根据查询模式设计索引等。同时,确保内容准确,比如InnoDB的聚簇索引结构,行数据存储的位置,以及二级索引的访问需要两次查找等。 现在需要将这些内容组织成一个结构化的回答,分点说明,使用适当的子标题,确保每个部分清晰,并且符合用户之前设定的格式要求,比如使用中文,正确的LaTeX语法,独立公式用$$包裹,行内公式用$包裹,避免使用Markdown格式。</think>以下是MySQL索引的核心知识点整理: ### 1. 索引基础原理 - **B+树结构**:主流索引类型,满足$O(\log n)$查询复杂度 $$ \text{节点容量}=16KB/(主键大小+指针大小) $$ 例:8B主键+6B指针 → 约1170子节点/层 - **页分裂机制**:当插入数据导致页使用率超过$\frac{15}{16}$时触发 - **聚簇索引**:InnoDB主键索引,数据与索引存储在一起(非主键时自动创建隐藏RowID) ### 2. 索引类型体系 | 类型 | 数据结构 | 支持引擎 | 特点 | |------|----------|----------|------| | 主键索引 | B+Tree | InnoDB | 唯一且非空,叶节点含完整数据 | | 唯一索引 | B+Tree | 所有引擎 | 强制列值唯一性 | | 普通索引 | B+Tree | 主要引擎 | 允许重复值,叶节点存主键 | | 全文索引 | 倒排索引 | InnoDB(5.6+) | 支持`MATCH AGAINST`查询 | | 空间索引 | R-Tree | MyISAM | 处理GIS数据,支持`MBRContains`等函数 | ### 3. 复合索引规则 - **最左前缀原则**: 索引`(a,b,c)`有效查询: ```sql WHERE a=1 AND b>2 WHERE c=3 AND b=5 AND a=2 -- 优化器自动调整顺序 ``` 无效场景: ```sql WHERE b=1 -- 跳过首列 WHERE a=1 AND c=3 -- 中间断层 ``` - **索引跳跃扫描**:MySQL 8.0新特性,即使未指定首列也可使用索引(需低基数首列) ### 4. 性能优化要点 - **覆盖索引**:查询字段全部包含在索引中,避免回表 ```sql -- 使用索引(a,b) SELECT b FROM table WHERE a=5 ``` - **索引下推(ICP)**:5.6+版本,WHERE条件在存储引擎层过滤 ```sql /* 索引(a,b), 查询条件a=1 AND b LIKE 'test%' */ 旧方案:回表后过滤b条件 ICP:在索引层直接过滤b条件 ``` - **索引选择率**:最优索引应满足 $$ \frac{\text{distinct值数量}}{\text{总行数}} \geq 10\% $$ ### 5. 索引失效场景 1. **隐式类型转换**: ```sql WHERE varchar_col = 123 -- 转换为字符串比较 ``` 2. **函数操作**: ```sql WHERE YEAR(create_time)=2023 -- 改为范围查询 ``` 3. **前导通配符**: ```sql WHERE name LIKE '%abc' -- 无法使用索引 ``` 4. **OR条件**: ```sql WHERE a=1 OR b=2 -- 除非a,b都有独立索引 ``` ### 6. 索引管理命令 ```sql -- 查看索引信息 SHOW INDEX FROM tbl; -- Cardinality统计 ANALYZE TABLE tbl; -- 强制使用索引 SELECT * FROM tbl USE INDEX(idx_name); -- 索引重建(消除碎片) ALTER TABLE tbl ENGINE=InnoDB; ``` ### 7. 设计实践准则 - **三星索引原则**: 1. WHERE条件列形成索引左前缀(★) 2. ORDER BY列包含在索引中(★) 3. 覆盖所有SELECT字段(★) - **空间占用计算**: 每GB数据约需额外100-300MB索引空间 - **写入代价**:每个索引增加约10%-20%的INSERT/UPDATE耗时 最新版本改进(MySQL 8.0): - 新增`INVISIBLE INDEX`功能,可暂时禁用索引测试影响 - 支持降序索引`(a DESC, b ASC)`,优化ORDER BY ... DESC查询 - 引入函数索引`INDEX((DATE(create_time)))`,突破字段操作限制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值