• MySQL学习系列(7)-每天学习10个知识



    👍 点赞,你的认可是我创作的动力!

    ⭐️ 收藏,你的青睐是我努力的方向!

    ✏️ 评论,你的意见是我进步的财富!


    1. 自增字段(Auto-increment)的优点和缺点

    优点

    • 简化数据插入:自增字段使得插入新记录时无需指定主键值,数据库会自动分配,减少了插入操作的复杂性。
    • 确保唯一性:自增字段通常用作主键,确保每个记录都有唯一的标识。
    • 提高性能:在主键上使用自增字段可以提高插入操作的性能,因为它不需要在插入时执行额外的唯一性检查。
    • 减少碎片:自增字段通常导致数据按顺序排列,有助于减少表的碎片化。

    缺点

    • 不适用于所有情况:自增字段不适用于所有表,例如需要使用复合主键或自定义标识的情况。
    • 不保证连续性:自增字段的值在删除记录后不会回收,可能会导致不连续的值。
    • 无法复制:自增字段的值在分布式系统或主从复制中可能会冲突。
    • 限制性:自增字段的大小有限,可能会在大数据量情况下耗尽。

    自增字段适合用作简单主键或作为辅助标识的情况,但在某些复杂场景下需要谨慎选择。

    2. 使用全文索引进行排序

    要使用全文索引进行排序,可以按以下步骤操作:

    1. 确保需要排序的列上存在全文索引。如果没有,首先创建全文索引。

    2. 在查询中使用MATCH子句进行全文搜索,并将结果按所需的排序规则排序。例如:

      SELECT * FROM articles
      WHERE MATCH(title, content) AGAINST('search query')
      ORDER BY relevance_score DESC;
      
      • 1
      • 2
      • 3

      上述示例中,relevance_score是用于排序的列,根据全文搜索的匹配度排序。

    3. 执行查询,将返回结果按指定的排序规则排列。

    全文索引通常用于实现文本搜索功能,可以根据搜索结果的匹配程度进行排序。

    3. 覆盖索引(Covering Index)和应用场景

    覆盖索引是指一个索引包含了所有在查询中需要的字段,因此不需要访问实际的数据行,就可以满足查询需求。覆盖索引的主要作用是提高查询性能,因为它可以减少磁盘I/O和内存消耗。

    应用场景包括:

    • 查询性能优化:当某个查询只需要索引中的字段时,使用覆盖索引可以避免访问实际数据行,提高查询速度。
    • 减少内存占用:覆盖索引可以减少内存中缓存的数据量,节省内存占用。
    • 降低磁盘I/O:由于不需要读取实际数据行,覆盖索引可以降低磁盘I/O操作。

    要使用覆盖索引,确保查询中只涉及到索引中的字段,并且这些字段可以满足查询需求。

    4. MyISAM 和 InnoDB 的选择情况

    选择使用MyISAM还是InnoDB取决于具体的需求和使用场景:

    • MyISAM

      • 适用于读密集型应用,因为它在读操作方面性能较好。
      • 不支持事务,因此不适合需要事务支持的应用。
      • 不支持外键约束,不适合要求强数据完整性的应用。
      • 适用于具有高并发读取但较少写入的应用,如博客系统、新闻网站等。
    • InnoDB

      • 适用于需要事务支持的应用,因为它支持ACID属性。
      • 支持外键约束,适合要求数据完整性的应用。
      • 适用于读写混合型应用,因为它在并发写入时性能较好。
      • 支持行级锁定,减小锁定粒度,提高并发性。

    一般来说,对于大多数应用,特别是涉及到事务和数据完整性的应用,推荐使用InnoDB。如果应用主要是读取操作,并且可以接受某些数据完整性的牺牲,那么MyISAM也可能是一个选择。

    5. MySQL的视图

    MySQL的视图是虚拟的表,它包含了从一个或多个基本表中检索出的数据。视图的作用包括:

    • 简化复杂的查询:可以将复杂的查询逻辑封装在一个视图中,然后在应用中直接查询视图,而不必编写复杂的SQL语句。
    • 数据安全性:视图可以用于隐藏底层表的某些列,只显示用户有权访问的数据,提高数据安全性。
    • 数据独立性:视图可以在不影响应用的情况下更改底层表的结构,提供数据独立性。
    • 重用查询逻辑:多个应用或查询可以重用相同的视图,避免了重复编写查询逻辑。

    视图并不实际存储数据,而是根据底层表的数据动态生成查询结果。MySQL支持普通视图、内联视图和复杂视图

    等。

    6. 回滚(Rollback)在数据库事务中的作用

    回滚是数据库事务的一个重要概念,它指的是将已执行的事务操作全部撤销,恢复到事务开始前的状态。回滚在数据库事务中的作用包括:

    • 维护数据一致性:如果事务的某个步骤失败或出现错误,回滚可以确保不会影响数据库的一致性。所有已执行的操作都会被撤销,不会保存到数据库中。
    • 撤销未提交事务:如果用户执行了一个事务但尚未提交(例如,用户取消了一个更新操作),回滚可以完全撤销该事务,使数据库恢复到原始状态。
    • 处理异常:当发生数据库错误或应用程序异常时,回滚可以用于恢复到事务开始前的状态,以避免数据损坏或不一致。

    回滚是事务处理中的关键机制,用于确保数据库的完整性和一致性。

    7. 有效使用子查询

    要有效使用子查询,需要考虑以下几点:

    • 使用适当的子查询类型:子查询可以用于不同的目的,包括过滤、计算、存在性检查等。选择合适的子查询类型取决于查询需求。
    • 限制结果集大小:子查询返回的结果集大小应该受到限制,以避免性能问题。可以使用LIMIT子句或其他限制条件。
    • 优化查询:确保子查询的查询条件和连接条件被正确地优化和索引,以提高性能。
    • 谨慎使用多层嵌套:避免过度嵌套子查询,因为它们可能会导致复杂的查询计划和性能下降。
    • 使用EXISTSIN子查询EXISTSIN子查询通常比JOIN子查询更有效,特别是在存在性检查的情况下。

    使用子查询可以提高查询的可读性和灵活性,但也需要谨慎使用,以避免性能问题。

    8. SQL注入的防止方法

    SQL注入是一种安全漏洞,允许攻击者在应用程序中执行恶意的SQL查询。为了防止SQL注入,可以采取以下措施:

    • 使用参数化查询:使用预编译语句或参数化查询来将用户输入的数据作为参数传递,而不是将其直接嵌入SQL查询字符串。
    • 输入验证:对用户输入的数据进行验证和过滤,确保只有有效的数据被传递给数据库。
    • 最小权限原则:将数据库用户的权限限制到最小必需的操作,避免使用具有过高权限的账户。
    • 错误消息掩盖:不要将详细的数据库错误信息暴露给用户,以防攻击者获取有关数据库结构的信息。
    • 编码和转义:在将用户输入插入到SQL查询中之前,对特殊字符进行适当的编码或转义,以防止它们被解释为SQL代码。
    • 安全框架:使用已经实现了SQL注入防护的安全框架或库。

    通过采取这些安全措施,可以有效防止SQL注入攻击。

    9. BLOB 和 TEXT 类型的区别

    BLOB(Binary Large Object)TEXT是两种不同的数据类型,它们的区别在于:

    • BLOB:用于存储二进制数据,如图像、音频、视频等。BLOB没有字符集,可以存储任何二进制数据,大小可以很大。
    • TEXT:用于存储文本数据,通常用于存储字符串。TEXT有字符集,可以存储字符数据,大小也可以很大。

    区别在于BLOB用于存储二进制数据,而TEXT用于存储文本数据。选择哪种类型取决于数据的性质和用途。

    在某些情况下,可能会选择使用BLOB而不是VARCHAR,例如,当需要存储二进制数据(如图像或文件)时。但要注意,存储大量二进制数据可能会影响数据库性能,因此需要谨慎使用。

    10. 联合主键(Composite Primary Key)的优点和缺点

    联合主键是由多个列组成的主键,它的优点和缺点如下:

    优点

    • 数据唯一性:联合主键可以确保多列组合的值是唯一的,这对于数据表中存在复杂唯一性约束的情况很有用。
    • 数据完整性:联合主键可以用于维护多列之间的数据完整性,确保它们的组合值是有效的。
    • 支持多列索引:联合主键可以作为多列索引,提高特定查询的性能。
    • 模型表现力:联合主键可以更好地反映业务需求,使数据表更贴近实际问题。

    缺点

    • 复杂性:联合主键可能会引入复杂性,包括更复杂的查询和索引维护。
    • 性能:联合主键的多列索引可能会影响插入和更新性能,因为索引更大且维护成本更高

    • 可读性:在某些情况下,联合主键可能会降低数据表的可读性,使表定义变得复杂。

    选择是否使用联合主键取决于具体的数据模型和查询需求。通常情况下,如果多列的组合确实具有唯一性和业务含义,那么联合主键是有意义的。但需要权衡性能和复杂性。

  • 相关阅读:
    力扣:104. 二叉树的最大深度(Python3)
    基于SpringBoot的导师双选系统设计与实现
    UnityShader(六)透明效果
    java并发编程:CopyOnWrite容器介绍
    TypeScript开启
    攻防演练中防守方的防护措施.
    【C++】多态
    扩展实现:Content Scripts、跨越请求、国际化、NPAPI 插件、消息传递、可选权限
    解密Prompt7. 偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析
    在centos7上搭建hadoop集群
  • 原文地址:https://blog.csdn.net/weixin_52003205/article/details/133103750