mysql 强制使用索引和强制不使用索引

2023-11-09

前一段面试时问过这个问题,当时不太懂,今天刚好看到这一块的内容就梳理下

首先说个概念

SQL提示

就是在sql中加入我自己的提示来达到我想要的效果

关于索引有三种sql提示


use index(index_name)

希望mysql参考的索引列表(也就是我想让mysql优先使用这些索引,其它索引不再考虑)

如在test1中查询

test1 有两个字段

主键id 

索引 name

explain select id from test1;


+------+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id   | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+------+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|    1 | SIMPLE      | test1 | index | NULL          | PRIMARY | 4       | NULL |   18 | Using index |
+------+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

这里用到了主键索引


我用use来限制下索引的使用,则出现下面的结果,优先使用我允许的索引


MariaDB [fei]> explain select id from test1 use index(name);
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
| id   | select_type | table | type  | possible_keys | key        | key_len | ref  | rows | Extra       |
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
|    1 | SIMPLE      | test1 | index | NULL          | name_index | 6       | NULL |   18 | Using index |
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+


ignore index (index_name)

  忽略某个索引(不使用某个索引)

MariaDB [fei]>  explain select name from test1 ;
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
| id   | select_type | table | type  | possible_keys | key        | key_len | ref  | rows | Extra       |
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
|    1 | SIMPLE      | test1 | index | NULL          | name_index | 6       | NULL |   18 | Using index |
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+


当我使用ignore限制时出现下面的情况,不在使用该了

MariaDB [fei]>  explain select name from test1 ignore index(name);
+------+-------------+-------+------+---------------+------+---------+------+------+-------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+-------+
|    1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL |   18 |       |
+------+-------------+-------+------+---------------+------+---------+------+------+-------+


但是我对主键进行了测试,貌似ignore对主键并不适用


force index(index_name) 

强制使用索引

MariaDB [fei]>  explain select id from test1 force index(name);
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
| id   | select_type | table | type  | possible_keys | key        | key_len | ref  | rows | Extra       |
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
|    1 | SIMPLE      | test1 | index | NULL          | name_index | 6       | NULL |   18 | Using index |
+------+-------------+-------+-------+---------------+------------+---------+------+------+-------------+



force index 和 use index 的区别

use index 只是给mysql优化器一种选择的可能,具体的mysql优化器再进行优化选择

但是 force index 是强制mysql优化器使用某个索引


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 强制使用索引和强制不使用索引 的相关文章

  • #1045 - 用户“root”@“localhost”的访问被拒绝(使用密码:YES)

    这可能看起来多余 但我无法找到正确的解决方案 我无法使用 mysql 控制台登录 mysql 它要求输入密码 但我不知道我实际输入的内容 有办法获取密码或更改密码吗 这就是我的 config inc 的样子 当我尝试打开 phpmyadmi
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl
  • 如何使用 PHP 从 MySQL 检索特定值?

    好吧 我已经厌倦了 过去一周我花了大部分空闲时间试图解决这个问题 我知道 SQL 中的查询已更改 但我无法弄清楚 我能找到的所有其他帖子似乎都已经过时了 如果有人能帮助我 我将非常感激 我想做的就是使用手动输入数据库的唯一 密码 来检索行的
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • 通过将行旋转为动态数量的列来在 MySQL 中创建摘要视图

    我在 MySQL 中有一个表 其中包含以下字段 id company name year state 同一客户和年份有多行 以下是数据示例 id company name year state 1 companyA 2008 1 2 com
  • “警告:mysql_query():提供的参数不是有效的 MySQL-Link” - 为什么?

    我的代码有什么问题吗 我不断收到此错误 Warning mysql query supplied argument is not a valid MySQL Link resource in functions php on line 4
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • 使用 MySQLdb 在 Python 中执行 .sql 文件

    我有一个 sql 文件 其中包含一堆 SQL 查询 每个查询跨越多行 我想通过 Python 在 MySQL 中执行这些查询MySQLdb sqlite3为此目的有一个 非标准快捷方式 称为executescript http docs p
  • SQL Server递归查询显示父级路径

    我正在使用 SQL Server 语句并有一张表 例如 item value parentItem 1 2test 2 2 3test 3 3 4test 4 5 1test 1 6 3test 3 7 2test 2 我想使用 SQL S
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • MYSql 前 10 名及其他总计

    我的查询运行良好 但我只需要前 10 个供应商 然后我需要将所有剩余的总计放在 所有其他 行中 如果没有单独的查询 我该如何做到这一点LIMIT 10 18446744073709551615 SELECT VENDOR fullname
  • 错误代码 13,SELECT INTO OUTFILE 问题

    我试图了解使用 INTO OUTFILE 命令时不断遇到问题的原因 我总是收到这个错误 ERROR 1 HY000 Can t create write to file var www p1 txt Errcode 13 SELECT pa
  • 在 Doctrine DQL 中选择 count() ,并使用左连接多对多单向关系,其中用户没有关系特定组

    情况 我尝试在 DQL 中为不属于特定组的用户选择 count 标准ManyToMany之间的单向关系User and Group实体来自FOSUserBundle and SonataUserBundle 系统 Symfony 2 5 D
  • 部署 dacpac 所需的权限

    我正在尝试使用 sqlpackage exe 在租户上部署 dacpac 目前 我正在向将部署此功能的帐户授予 SysAdmin 或 db owner 权限 并且它工作正常 但在生产中 如果目标租户数据库属于其他应用程序 我可能无法获得这些
  • 如何编写 bash 函数来包装另一个命令?

    我正在尝试编写一个函数包装器mysql command If my cnf存在于 pwd 中 我想自动附加 defaults file my cnf到命令 这就是我正在尝试的 function mysql if e my cnf then
  • 1:1 关系中的双向外键约束

    我正在使用 MySQL 数据库 在我的关系数据模型中 我有两个相互 1 1 关联的实体 在我的架构中 通过将 FK 字段放入两个表之一中来建立 1 1 关系 该字段与另一个表的 PK 相关 两个表都有 PK 并且都是自动递增的 BIGINT
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • MySQL 和 MariaDB 数据库有什么区别?

    我已经使用 XAMPP 很长时间了 很惊讶 XAMPP 已经从 MySQL 切换到了 MariaDB https www apachefriends org index html https www apachefriends org in
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • Unity3D AssetBundles 动态加载游戏资源

    AssetBundles are files which you can export from Unity to contain assets of your choice These files use a proprietary co
  • ERP的权限管理的操作与设计--开源软件诞生24

    赤龙ERP用户与权限管理讲解 第24篇 用日志记录 开源软件 的诞生 进入地址 点亮星星 祈盼着一个鼓励 博主开源地址 码云 https gitee com redragon redragon erp GitHub https github
  • 设计模式之享元模式

    享元模式是对象池的一种实现 用来尽可能减少内存使用量 它适合用于可能存在大量重复对象的场景 来缓存可共享的对象 达到对象共享 避免创建过多对象的效果 这样依赖就可以提升性能 避免内存移除等 享元对象中的部分状态是可以共享 可以共享的状态称为
  • 使用Microsoft Word2016无法正常对Latex文本转换的踩坑和解决方法

    相信很多人都遇到像我一样的问题 word2016中 有latex的按钮 按ALT 就可以开始写公式 复制粘贴latex公式之后 怎么就转换不了呢 就是如图这样的 左上角转换按钮为灰色 上网找呀找 找了很多资料 大多数都是介绍用法的 但是转换
  • 图像语义分割的前世今生

    1998年以来 人工神经网络识别技术已经引起了广泛的关注 并且应用于图像分割 基于神经网络的分割方法的基本思想是通过训练多层感知机来得到线性决策函数 然后用决策函数对像素进行分类来达到分割的目的 这种方法需要大量的训练数据 神经网络存在巨量
  • GIT基本使用记录

    1 git配置与查看用户名与邮箱命令 git config global user name your name git config global user email your email 163 com git config glob
  • 根据这些超参数构建Transformer模型。

    对不起 您需要提供更多信息 以便构建Transformer模型 您需要提供超参数的详细列表 以便构建模型 您可以提供以下超参数以构建Transformer模型 模型大小 例如 隐藏层的大小 头的数量 编码器和解码器层的数量 门控循环单元 G
  • 左值和右值

    左值引用 也就是 常规引用 不能绑定到要转换的表达式 字面常量 或返回右值的表达式 而右值引用恰好相反 可以绑定到这类表达式 但不能绑定到一个左值上 右值引用就是必须绑定到右值的引用 通过 获得 右值引用只能绑定到一个将要销毁的对象上 因此
  • mybatis-plus复杂条件查询

    针对 mybatisplus 的复杂条件 需要将条件封装到 QueryWrapper 和 UpdateWrapper 对象中 1 QueryWrapper 查询 删除条件封装 QueryWrapper 对象用于封装查询 删除条件 2 Upd
  • oracle数据库时分秒格式_Oracle如何输出指定格式的日期时间数据呢?

    摘要 下文讲述Oracle数据库输出指定的日期时间格式的方法分享 如下所示 实现思路 使用TO CHAR系统函数 指定输出格式为 即可将日期时间转换为指定格式的字符串 如 SELECT TO CHAR SYSDATE YYYY MM DD
  • 学生信息管理系统(C语言)

    高级程序设计 学生管理系统 C语言 本项目可以简单的实现学生信息的增 删 改 查 统计 存储等基本功能 环境是Dev C 创建学生信息文件 根据提示输入学生的各项信息 然后按学号对学生信息进行排序 并将排序后的学生信息存储到文件中 增加学生
  • 网络nan的原因_深度学习网络训练中出现nan的原因分析

    nan Not a Number 错误后果 造成训练准确率的断崖式下跌 两种出现地点 1 在loss函数中出现nan 出现原因 一般是因为tf中的log函数输入了 负数 或 0 值 出现log 0 0的情况 解决方法 使用tf clip b
  • MQTT

    MQTT 菜鸟资料收集 https blog csdn net bangdingshouji article details 52576110 https github com menudoproblema libemqtt https b
  • 使用exceljs导出excel表格

    背景 最近在使用electon写一个桌面程序 需要对数据进行excel导出操作 这里选择使用 exceljs 来完成这个功能 下面是exceljs导出功能的简单实现 功能实现 下载 exceljs yarn add exceljs 引入 e
  • 【Mysql】使用语句插入数据的方法

    mysql中常用的三种插入数据的语句 insert into表示插入数据 数据库会检查主键 如果出现重复会报错 replace into表示插入替换数据 需求表中有PrimaryKey 或者unique索引 如果数据库已经存在数据 则用新数
  • 【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 主要特点
  • Mongodb的安装部署

    Mongodb的安装部署 一 环境介绍 二 配置mongodb的yum源 三 安装mongodb 三 启动mongodb 1 mongodb启动 2 查看mongodb的状态 3 查看监听端口 四 进入mongodb 五 查看mongodb
  • 有关html,css的实用知识总结(二)

    1 CSS 选择符有哪些 哪些属性可以继承 优先级算法如何计算 1 id 选择器 myid 2 类选择器 myclassname 3 标签选择器 div h1 p 4 相邻选择器 h1 p 5 子选择器 ul lt li 6 后代选择器 l
  • H5 PCM转WAV实时音频直播代码实现细节

    一 前端实现 H5数据采集 web audio的概念和使用详见 接口文档 采集音频数据 var context new AudioContext var audioInput context createMediaStreamSource
  • mysql 强制使用索引和强制不使用索引

    前一段面试时问过这个问题 当时不太懂 今天刚好看到这一块的内容就梳理下 首先说个概念 SQL提示 就是在sql中加入我自己的提示来达到我想要的效果 关于索引有三种sql提示 use index index name 希望mysql参考的索引