首页 > 数据库 >MySQL 选错索引

MySQL 选错索引

时间:2024-10-15 20:23:22浏览次数:4  
标签:选错 10000 MySQL 索引 between query where select

查看执行计划选择的索引

explain select * from t where a between 10000 and 10000;

通过慢日志(slow log)查看语句执行情况

-- 启动慢日志
SHOW VARIABLES LIKE 'slow_query_log';

-- 慢日志存储位置
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 慢日志阈值
SHOW VARIABLES LIKE 'long_query_time';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

强制选择索引

select  * from t force index(a) where a between 10000 and 20000;

选错索引原因:统计信息不准确

基数:索引上不同值的个数,基数越大,索引区分度越好。

查看索引基数

show index from t;

MySQL 计算索引基数使用采样统计法:

  • 选择N个页,统计每页不同值,计算平均数,再乘以页面数,得到索引基数
  • 当变更行数超过 1/M 时,自动触发索引统计

索引统计方式,innodb_stats_persistent

  • on,统计信息持久持久化,N=20,M=10
  • off,统计信息只存储在内存,N=8,M=16

通过执行计划查看预告扫描行数

explain select * from t where a between 10000 and 20000;

优化器选择索引判断:基数、扫描行数、回表次数

可以通过执行计划和慢日志判断预估扫描行数是否符合实际扫描行数

修复统计信息不准确

analyze table t

选错索引原因:需要使用临时表或排序

因为需要排序,InnoDB 可能会选择 b 索引

explain select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 1;

选错索引处理

使用 force index 强行选择索引

select * from t force index(1) where a between 10000 and 20000;

在保证逻辑相同的情况下,修改语句,引导 MySQL 使用期望的索引

explain select * from t where a between 1 and 10000 and b between 50000 and 100000 order by b, a limit 1;
select * from (select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 100)alias limit 1;

新建更合适的索引或删除错误索引

标签:选错,10000,MySQL,索引,between,query,where,select
From: https://www.cnblogs.com/liaozibo/p/18468337

相关文章

  • Elasticsearch正向索引与倒排索引
    Elasticsearch正向索引与倒排索引一、正向索引首先,要明白什么是正向索引,所谓正向索引,就是在查找某项数据时,按照id一条一条查找,如果当前数据中包含所需数据,则将当前数据取出,不包含则抛弃,直至全部遍历结束。例如:当我们按照正向索引去寻找包含小米三星苹果的数据时,会从头遍历一遍,......
  • 倒排索引和ES相关概念对比MySQL
    1.倒排索引1.1倒排索引两个重要概念:文档:用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息以京东商城为列词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这......
  • C++使用MySQL官方的C API访问MySQL数据库
    这篇文章是一个简单的C++使用MySQL官方的CAPI访问MySQL数据库的代码示例。//main.h#ifndef_H_#define_H_#include<stdio.h>#include<Windows.h>#include<mysql.h>#pragmacomment(lib,"libmysql.lib")#defineinsert_prepare"insertintotest_tbvalue......
  • jumpserver堡垒机部署 添加资产主机和MySQL数据库,图解过程
    jumpserver堡垒机部署JumpServer是广受欢迎的开源堡垒机,是符合4A规范的专业运维安全审计系统。JumpServer帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权、事中监察、事后审计,满足等保合规要求。下载软件包JumpServer-开源堡垒机-官网#官方网址......
  • Elasticsearch相关概念对比MySQL
    MySQLElasticsearch说明TableIndex索引(index),就是文档的集合,类似数据库的表(table)RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)SchemaMappingMappi......
  • Elasticsearch相关概念对比MySQL
    Elasticsearch和MySQL是两种不同的数据管理系统,各自有其独特的概念和应用场景。以下是它们在几个关键概念上的对比:o数据模型Elasticsearch:。文档(Document):基本的数据单元,存储为JSON格式。。索引(Index):类似于数据库,包含多个文档。。类型(Type):在7.x版本后已被弃用,之前用于逻......
  • 倒排索引
    倒排索引(InvertedIndex)是一种索引方法。在信息检索系统中非常常见,尤其是在全文搜索引擎中。主要思想:将文档中出现的每个词与包含该词的文档列表关联起来,从而实现快速检索。倒排索引的基本结构1、词汇表(Dictionary):包含所有文档集合中出现过的唯一词汇,以及指向每个词对应的......
  • [如何实现多向量索引策略提升检索精度:从理论到实战]
    如何实现多向量索引策略提升检索精度:从理论到实战引言在信息检索领域,检索精度往往是衡量系统性能的重要指标之一。多向量索引策略(Multi-VectorIndexingStrategy)是提高检索精度的有效方法之一。本文将详细介绍这种策略的实现方法,并通过具体的代码示例帮助读者在实际项目......
  • mysql:赋予表格数据、用 cmd 运行 mysql 访问数据。
    前言:mysql:新建数据库与数据表,并用cmd运行mysql成功访问到了数据。-CSDN博客(一)创建表格数据打开MySQLWorkbench,跟据以下步骤操作。完成以上步骤,表格数据提交成功,现在打开cmd命令符运行mysql。(二)借助cmd运行mysql数据mysql-uroot-p(运行) showdatabase......
  • docker-compose安装mysql/redis/nacos环境
    dockerdocker-compose安装查看上一篇文章1.新建目录并创建docker-compose.yaml文件文件内容services:mysql:image:mysql:8.2.0container_name:mysqlenvironment:MYSQL_ROOT_PASSWORD:1qaz@WSXMYSQL_DATABASE:nacosMYSQL_USER:......