首页 > 数据库 >Mysql库表无索引查询优化

Mysql库表无索引查询优化

时间:2024-08-16 16:49:22浏览次数:8  
标签:记录 Mysql kh 索引 库表 MySQL jd id

情况

单表三千万数据量,只有id这一个索引无其他索引,这时候使用无索引的kh字段查询数据

分页查询优化

explain 
SELECT 
	* 
FROM 
	dev_log_27_2024 
WHERE jd_kh = '14344692103' 
ORDER BY 
	id DESC 
LIMIT 0,10000 

带where
image
不带where
image

sql执行流程

  1. 全表扫描(Full Table Scan)
    由于 jd_kh 列没有索引,MySQL 无法通过索引快速查找符合 jd_kh = '14344692103' 条件的记录,因此必须进行全表扫描。
    • 逐行扫描:MySQL 会从表的第一个数据页开始,逐行扫描整个表中的每一条记录。
    • 过滤条件:在扫描的过程中,MySQL 会检查 jd_kh 列是否等于 '14344692103'。符合条件的记录将被保存在内存中的一个结果集中。
  2. 使用主键索引排序(ORDER BY id DESC)
    • 主键索引的作用:id 列是主键,并且主键索引在 MySQL 的 InnoDB 存储引擎中是一个聚集索引(Clustered Index),数据实际上按 id 顺序存储。
    • 降序排序:由于查询中包含 ORDER BY id DESC,MySQL 需要对符合条件的记录按照 id 进行降序排序。
    • 由于 id 是主键,MySQL 可以直接使用扫描过程中已经按主键顺序获取的记录来进行排序,效率相对较高。
    • 但是,排序仍然会涉及到对符合 jd_kh 条件的所有记录进行比较。
  3. 应用 LIMIT 条件
    • 截取前 10,000 条记录:MySQL 会根据 LIMIT 0, 10000 截取排序后的前 10,000 条记录,并将这些记录返回给客户端。
    • 停止扫描:一旦获取了 10,000 条记录,MySQL 将停止继续扫描和处理后续的行。
  4. 返回结果
    • MySQL 将最终筛选、排序、截取的结果集返回给客户端。
    总结
    由于 jd_kh 列没有索引,MySQL 必须执行全表扫描来查找符合 jd_kh = '14344692103' 条件的记录。这些记录会在扫描过程中按 id 主键进行排序,然后 MySQL 会根据 LIMIT 返回前 10,000 条记录。
    这种执行方式对于大表(如包含数百万或数千万条记录的表)来说效率较低,特别是在 jd_kh 条件筛选出大量记录的情况下。为了提高查询效率,建议在 jd_kh 列上添加索引,或者优化查询策略。

limit 10比limit 1000快很多的原因

limit 10很快,但是limit 1000超级慢就是因为全表扫描找到1000条该记录的数据需要扫描的记录非常大,所以很慢,而10条数据很快就可以找到,但是页码越往后查询越慢就是因为要扫描的记录书变多.

标签:记录,Mysql,kh,索引,库表,MySQL,jd,id
From: https://www.cnblogs.com/aeolian/p/18363074

相关文章

  • Mysql实现自增长编号,日期+序列
    Mysql实现自增长编号,日期+序列,序列定时归零https://blog.csdn.net/u010355502/article/details/47155905/Mysql生成序列---拼接字符串用于业务主键https://blog.csdn.net/Good_omen/article/details/123838440查看所有函数mysqlmysql查看函数命令https://blog.51cto.com/u_16......
  • 【MySQL】开启并行复制
    一、介绍在官方的5.6版本之前,MySQL只支持单线程复制,由此在主库并发高、TPS高时就会出现严重的主备延迟问题。如果备库执行日志的速度持续低于主库生成日志的速度,那么主从延迟就有可能成了小时级别。而且对于一个压力持续比较高的主库来说,备库很可能永远都追不上主库。1>MyS......
  • Node.js在MySQL做增删改查
    constmysql=require('mysql');require('dotenv').config();varconnection=mysql.createConnection({host:'xxx.xx.xxx.187',port:'13306',user:'root',password:process.env.MYSQL_P......
  • JDBC连接MySQL实现增删改查
    准备工作下载安装MySQL下载安装MySQLWorkbench下载mysql-connector-java.jar放在java新建项目新建文档libs下步骤总结1、对数据库进行连接2、写SQL语句3、执行SQL语句4、关闭资源一、JDBC概念JDBC(JavaDataBaseConnectivity)就是Java数据库连接,就是用Java语言来操作......
  • MySQL数据库支持存储引擎
    MySQL数据库支持多种存储引擎,以下是几种常见的存储引擎:###1.**InnoDB**-**特性**:InnoDB是MySQL默认的事务型存储引擎,支持ACID事务、行级锁定和外键约束。-**优点**:提供高可靠性、自动恢复、并发性强,适合高并发的应用场景。-**缺点**:相比其他存储引擎,InnoDB在......
  • mysql8.0 主从架构模式【0到1架构系列】
    前提条件准备3,4,5台虚拟机祼装mysql8.0主从架构常见两种模式“一主多从”和“级联复制”两种,基本都很简单,都是依赖binlog日志文件进行同步,binlog日志会记录DDL和部分DDL语句,进行同步时从库会重新执行这些语句从而实现主从同步。步骤1:配置主/从服务器的server_id,如......
  • 面试mysql
      在MySQL中,索引用于提高查询性能。索引的类型有多种,主要包括以下几种:1.**普通索引(NormalIndex)**:-这是最常见的索引类型,没有任何约束条件。-可以重复,允许`NULL`值。-创建方法:```sqlCREATEINDEXindex_nameONtable_name(column_name);```......
  • MySQL-主主模式集群部署
    目录一、简介什么是双主复制二、服务器规划三、安装MySQL1.下载安装包1.1关闭防火墙2.创建相关目录3.配置环境变量4.初始化数据库A4.1设置环境变量4.2初始化配置文件4.3初始化数据目录4.4配置启动脚本4.5启动MYSQL4.6设置root密码4.7允许root远程登录5.初始化数据库B5.1......
  • MySql介绍
    MySQL是单进程多线程模型,一个SQL语句无法利用多个cpucore去执行,这也就决定了MySQL比较适合OLTP(特点:大量用户访问、逻辑读,索引扫描,返回少量数据,SQL简单)业务系统key、uniquekey、primarykey:https://blog.csdn.net/nanaMasuda/article/details/52543177sql语句执行顺序(8)S......
  • [笔记]关于在linux中通过yum安装mysql错误--因为Centos 7官方镜像不可用的解决方法
     因为Centos7在2024年6月30号停止维护   在执行命令时找不到镜像源, 在下载时出现的错误为,还有一种错误由于没有截图,但是问题一样先通过yumremovemariadb*-y去删除自带的sql包通过命令编辑这个文本文件 vim/etc/yum.repos.d/CentOS-Base.repo这里举......