博客
关于我
如何创建数据库mysql索引,单索引和联合索引如何使用?
阅读量:743 次
发布时间:2019-03-21

本文共 1497 字,大约阅读时间需要 4 分钟。

数据库索引是数据库性能优化的关键,但了解和使用索引也需要谨慎。作为数据库管理员或开发人员,我们需要掌握索引的使用技巧,避免常见的误区。本文将总结一些实践经验,帮助大家更科学地使用索引。

一、数据库索引的创建与使用

数据库索引的类型主要有单索引和联合索引。单索引仅针对一个字段进行 optimization,而联合索引则结合多个字段的信息,提升查询效率。在实际应用中,需要注意以下几点:

  • 索引的选择性

    • 单独的索引或联合索引在查询条件中只能使用其中一个。
    • 如果查询条件同时包含两个索引字段,系统会优先选择数据量较小的索引进行查询。
  • 联合索引的命中原则

    • 联合索引的命中规则是严格按照索引字段的顺序进行的,即从左到右依次检查。
    • 例如,联合索引(A,B,C),在查询时如果仅使用B字段、C字段或A字段,命中率都很低。只有同时满足A、B、C三个字段的条件时,才会命中联合索引。
  • 索引的负载与内存管理

    • 索引会被加载到内存中,但索引量过多可能引起内存压力,这需要合理规划。
  • 二、SQL执行计划的解读

    了解SQL执行计划可以帮助我们分析索引的使用效果。通过EXPLAIN命令,我们可以看到以下关键信息:

    • possible_keys: 可能使用的索引列表。
    • key:实际使用的索引。
    • 如果keyNULL,表示没有使用索引,而是进行了全表扫描,这对于大量数据的表来说很危险。

    注意以下几点:

    • 如果关键查询在执行计划中显示key为空,需要冷静分析查询逻辑,检查是否存在索引设计上的问题。
    • 不要轻信某些预估值,应该通过实际测试来验证执行计划的准确性。

    三、索引失效的常见原因及解决方案

    在实际应用中,索引可能会失效,导致查询性能下降。以下是一些常见的索引失效原因及优化方法:

  • LIKE 操作中的百分比忽略

    • 原因LIKE后缀有%但开头没有%(即形如%M%)时,索引会失效。
    • 优化方法:可以通过函数保存到变量,然后对变量进行 %操作,例如395var charvariable = concat('%', left_porit).
    • 例子SELECT * FROM table WHERE name LIKE '%abc'会失效,但SELECT * FROM table WHERE name LIKE '_abc'仍然可能命中索引。
  • OR 语句的逻辑问题

    • 原因:如果OR运算符的两边字段只有一个是索引,索引将失效,只发生全表扫描。
    • 优化方法:将OR拆分为IN语法。
  • 联合索引的命中问题

    • 原因:当查询条件部分匹配联合索引但未命中,或部分字段未命中。
    • 优化方法:确保查询条件严格遵循联合索引的字段顺序。
  • 数据类型与隐式转换

    • 原因:未加括号导致字段类型隐式转换,影响索引选择。
    • 优化方法:始终加括号明确字段类型。
  • 不等于操作的适用性

    • 原因:使用=, <, >等操作符,索引可能不会被使用。
    • 优化方法:将不等于操作改为范围查询,例如key>0key<0.
  • 函数计算与计算器逻辑

    • 原因:计算字段会导致索引失效。
    • 优化方法:合理设计函数调用位置,尽量避免对索引字段进行计算操作。
  • 全表扫描的优化

    • 原因:索引ipline数低于全表扫描效率时,系统会选择全表扫描。
    • 优化方法:增加索引的iline数,提升查询性能。
  • 推荐阅读

    • 如果需要更深入了解索引的使用,建议参考《数据库索引优化_strip刷题+实战065》,结合具体业务场景进行优化。
    • 如果您的数据库存在频繁超时问题,可参考技术文章《数据库超时排查技术指南》。

    通过这些实践经验和优化措施,我们相信大家能更科学地设计和使用索引,提升数据库整体性能。如有疑问,或许我可以为您解答。

    转载地址:http://bbrgz.baihongyu.com/

    你可能感兴趣的文章
    mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
    查看>>
    Multiple websites on single instance of IIS
    查看>>
    mysql CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>
    MySQL DBA 数据库优化策略
    查看>>
    multi_index_container
    查看>>
    mutiplemap 总结
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>