转载:数据库篇---最左匹配原则详解

Mysql索引最左匹配原则

前提知识:使用explain确定一条查询计划
示例表SQL:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `cid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_cid_INX` (`name`,`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

SQL1:

EXPLAIN SELECT * FROM student WHERE cid=1;--type:index

SQL2:

EXPLAIN SELECT * FROM student WHERE cid=1 AND name='小红';--type:ref
解释一下index和ref的区别:
* index:mysql会对整个该索引进行扫描,效率低,会遍历索引中数据知道符合为止,触发:只要是索引,或者是某个复合索引的一部分
* ref:mysql内部使用特定算法优化过的,触发:索引字段数据必须有序。

复合索引:以该表的(name,cid)复合索引为例,内部简单来说就是这样排列的:

name cid
a——-6
c——-4
c——-5
h——-1
z——-9

* mysql创建复合索引的规则是首先对复合索引最左边的(这里是name)字段的数据进行排序,在此基础上,再对后面的字段(这里是cid)进行排序,类似于order by name cid这样
* 第一个字段(name)是绝对有序的,后面的字段就是无序的了,一般情况下第二个cid字段进行条件判断是用不到索引的,可能出现type是index类型的,这就是mysql最左前缀的原因。
使用到的场景:
* cid字段的索引数据也是有序的时候,便可以使用,当name字段是等值匹配的情况下,cid是有序的,当name都是c的时候,cid的排序是4、5。
* mysql索引规则中要求复合索引要想使用第二个索引,必须先使用第一个索引。

对于

EXPLAIN SELECT * FROM student WHERE cid=1 AND name='小红';

复合索引是(name, cid),这时mysql查询优化器会纠正这条sql语句该以哪种顺序执行效率最高,最后生成真正的执行计划(QEP),尽量利用到索引时查询顺序效率最高。所以mysql查询优化器最终会以这种顺序查询。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Quartz中,数据库集群是一种高可用性的解决方案。它允许多个Quartz实例共享同一个数据库,并且能够自动协调任务的执行,从而保证任务的可靠性和稳定性。 但是,在多个Quartz实例同时操作同一个数据库时,必须确保它们之间的数据一致性。这就需要使用锁机制来保证数据的正确性和安全性。 Quartz提供了两种类型的锁:悲观锁和乐观锁。它们分别采用不同的方式来保证数据的一致性。 1. 悲观锁 悲观锁是一种悲观的认为并发环境下会出现冲突的锁机制。它在操作数据时,会先加锁,然后再进行操作,操作完成后再释放锁。 在Quartz中,悲观锁是通过数据库中的行级锁来实现的。当一个Quartz实例要对某个任务进行操作时,它会先获取该任务的行级锁,然后再进行操作。其他实例在此期间无法获取该任务的锁,从而保证了数据的一致性。 2. 乐观锁 乐观锁是一种乐观的认为并发环境下不会出现冲突的锁机制。它在操作数据时,不会加锁,而是通过版本号等方式来判断数据是否发生了变化。 在Quartz中,乐观锁是通过版本号来实现的。每个任务都有一个版本号,当一个Quartz实例要对某个任务进行操作时,它会先获取该任务的版本号,然后进行操作。如果在此期间该任务的版本号发生了变化,则说明其他实例已经对该任务进行了操作,当前实例的操作会失败,需要重新获取版本号并重试。这样可以保证数据的一致性。 总的来说,悲观锁适用于高并发、数据冲突严重的场景,但是会带来较大的性能开销;而乐观锁适用于并发量较小、数据冲突不严重的场景,性能开销较小。在Quartz中,可以根据具体的业务需求选择合适的锁机制来保证数据的正确性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值