通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

MySQL索引失效原理是什么

索引失效问题是面试必问问题,因为索引失效的情况比较多,很多同学记不住,面试的时候回答不好。我仔细研究了七七四十七天,设计了一句七字口诀,记住这句口诀,以后再遇到这个问题就可以拿满分了。

一、MySQL索引失效原理

索引失效问题是面试必问问题,因为索引失效的情况比较多,很多同学记不住,面试的时候回答不好。我仔细研究了七七四十七天,设计了一句七字口诀,记住这句口诀,以后再遇到这个问题就可以拿满分了。

七字口诀就是:

模 型 数 空 运 最 快

口诀字面意思就是,要运送一个产品模型的话,要用空运,不要用陆运和海运,数空运非常快。叫做:模型数空运非常快。

下面我拆开逐字讲解一下:

:模糊查询的意思。like的模糊查询以%开头,索引失效。比如:

SELECT * FROM `user` WHERE `name` LIKE ‘%老猿’;

:代表数据类型。类型错误,如字段类型为varchar,where条件用number,索引也会失效。比如:

SELECT * FROM `user` WHERE height= 180;

height为varchar类型导致索引失效。

:是函数的意思。对索引的字段使用内部函数,索引也会失效。这种情况下应该建立基于函数的索引。比如:

SELECT * FROM `user` WHERE DATE(create_time) = ‘2020-09-03’;

create_time字段设置索引,那就无法使用函数,否则索引失效。

:是Null的意思。索引不存储空值,如果不限制索引列是not null,数据库会认为索引列有可能存在空值,所以不会按照索引进行计算。比如:

SELECT * FROM `user` WHERE address IS NULL不走索引。

SELECT * FROM `user` WHERE address IS NOT NULL;走索引。

建议大家这设计字段的时候,如果没有必要的要求必须为NULL,那么较好给个默认值空字符串,这可以解决很多后续的麻烦(切记)。

:是运算的意思。对索引列进行(+,-,*,/,!, !=, <>)等运算,会导致索引失效。比如:

SELECT * FROM `user` WHERE age – 1 = 20;

:是最左原则。在复合索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。

:全表扫描更快的意思。如果数据库预计使用全表扫描要比使用索引快,则不使用索引。

延伸阅读:

二、双主架构实现方案

1、主备模式,两台MySQL互为主从,其中一台作为主节点对外提供服务,另外一台作为备机节点(standby),当提供服务的主节点发生故障后,将服务请求快速切换到备用节点,原主节点故障恢复后转换为备用节点(standby)。
2、主主模式,两台MySQL互为主从,且两台MySQL均作为主节点对外提供服务,当其中一台MySQL发生故障后,将指向该故障节点的请求快速切换到另外一台MySQL,原来指向非故障节点的请求不受影响。
在主主模式下,两个主库都提供读写服务,如果应用通过两个主库操作相同数据,则会发生冲突导致数据覆盖(使用语句模式复制)或复制异常(使用行模式复制),因此需要对读写服务进行控制:
1、基于自主主键控制,通过设置自增属性auto_increment_offset和auto_increment_increment来控制每个主节点生产不同的自增值,并根据不同自增值访问不同主节点。
2、基于库级别或表级别控制,如应用APP1访问节点node1上的DB1库,而应用APP2访问节点node2上的DB2库,两个主节点间不会操作相同表的数据,因此不会存在事务冲突。
为保证应用程序使用相同数据库连接配置而不受故障切换影响,常用方案有:
1、VIP,通过vrrpd或keepalived将VIP动态绑定到新主节点
2、域名,通过切换域名将域名指向新主节点
3、代理,通过更新代理中存放的路由信息来指向新主节点。

相关文章