正确使用数据库索引

el/2024/2/26 0:21:16

一 索引未命中

并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题

1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:>、>=、<、<=、!= 、between...and...、like、

大于号、小于号

不等于!=

between ...and...

like

2 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录

先把表中的索引都删除,让我们专心研究区分度的问题

#先把表中的索引都删除,让我们专心研究区分度的问题
mysql> desc s1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | YES  | MUL | NULL    |       |
| name   | varchar(20) | YES  |     | NULL    |       |
| gender | char(5)     | YES  |     | NULL    |       |
| email  | varchar(50) | YES  | MUL | NULL    |       |
+--------+-------------+------+-----+---------+-------+
rows in set (0.00 sec)mysql> drop i

http://www.ngui.cc/el/4893742.html

相关文章

ThreadLocal-hash冲突与内存泄漏

ThreadLocal是什么 ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射&#xff0c;各个线程之间的变量互不干扰&#xff0c;在高并发场景下&#xff0c;可以实现无状态的调用&#xff0c;特别适用于各个线程依赖不同的变量值完成…

lambda表达式创建线程、获取cpu的核数、线程睡眠

import java.util.concurrent.TimeUnit; class test1{public static void main(String[] args) {// lambda 表达式创建线程 jdk1.8// lambda表达式: (参数)->{ 代码 }new Thread(()->{try {// 线程睡眠TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.pr…

synchronized 与 Lock

Synchronized 和 Lock 区别 1、Synchronized 内置的Java关键字, Lock 是一个Java类 2、Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁 3、Synchronized 会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁 4、Synchronized 线程 1(获得锁,阻塞)、线程2(等…

集合类-多线程下不安全及其解决办法

1 List 不安全 import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;…

四大函数式接口(必需掌握)

新时代的程序员: lambda表达式、链式编程、函数式接口、Stream流式计算 1. 函数式接口: 只有一个方法的接口 @FunctionalInterface public interface Runnable {void run(); }// 简化编程模型,在新版本的框架底层大量应用! 只要是 函数型接口 就可以 用 lambda表达式简化: …

ForkJoin与Stream并行流

ForkJoin 在 JDK 1.7 , 并行执行任务!提高效率。大数据量! ForkJoin 特点:工作窃取 这个里面维护的都是双端队列 以下计算1-10_0000_0000的和,for循环与ForkJoin效率差别不大,但是使用Stream并行流效果显著!!! import java.util.*; import java.util.concurrent.Executi…

Volatile-内存屏障

Java 中如何保证底层操作的有序性和可见性&#xff1f;可以通过内存屏障。 内存屏障是被插入两个 CPU 指令之间的一种指令&#xff0c;用来禁止处理器指令发生重排序&#xff08;像屏障一样&#xff09;&#xff0c;从而保障有序性的。 另外&#xff0c;为了达到屏障的效果&a…

单例模式安全之反射攻击

单例模式这里就不谈了&#xff0c;什么是单例模式可参考七种Java单例模式详解,这里是关于单例模式安全方面的&#xff0c;当然了这里说的安全不是线程安全。 什么是反射攻击呢 在Java中&#xff0c;由于反射的功能实在是太强了&#xff0c;通过动态访问类并设置Access(如setA…

ubuntu 解决优盘文件 read-only file system 问题

1.进入root: sudo su2.显示分区&#xff1a; df -Th 结果如下&#xff1a; Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 3.8G 0 3.8G 0% /dev tmpfs tmpfs 784M 9.5M 775M 2% /run /dev/sdb2 ext4 …

Mybatis Mapper接口是如何找到实现类的-源码分析

转载自:https://www.cnblogs.com/demingblog/p/9544774.html KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态理,Proxy.newProxyInstance,Mapper 映射,Mapper 实现 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程…