mysql - Mysql索引使用问题
问题描述
mysql是基于docker安装的,具体版本是MYSQL_VERSION=8.0.25-1debian10
表结构
CREATE TABLE `test_index` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `my_id` varchar(100) NOT NULL COMMENT 'ID', `name` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
表数据
select * from test_index; +----+-------+-----------+ | id | my_id | name | +----+-------+-----------+ | 1 | 1 | test name | +----+-------+-----------+
问题陈述
请注意explain:possible_keys
和的执行结果key
。</p>对于 中的
my_id
列test_index
,没有索引,为什么在使用PRIMARY索引的update语句中作为条件使用?出于困惑,我确实在相同的条件下执行了删除语句操作,执行结果和我最初预期的一样,没有使用任何索引。
对具有相同条件的语句使用不同的索引或为什么使用它们的基本原理是什么?寻求您的帮助,谢谢!
- 修改语句
explain update test_index set name="update name" where my_id=1; +----+-------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ | 1 | UPDATE | test_index | NULL | index | NULL | PRIMARY | 8 | NULL | 1 | 100.00 | Using where | +----+-------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
- 删除语句
explain delete from test_index where my_id=1; +----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | DELETE | test_index | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where | +----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+-------------+
- 修改语句
解决方案
简短的回答:可能会有所不同。它可能取决于记录的数量。
更新:没有找到合适的索引,使用主索引。
不需要使用主键的索引,但是索引无论如何都是可用的。同时修改表时可能会更好。
DELETE : 没有找到合适的索引,没有使用任何索引。
这里主键的索引发生了变化,可能有几条相同的记录
my_id
被删除了。所以与其分段进行索引更改,不如重建一次主键的索引。
推荐阅读
- pine-script - 为 24 小时交易创建可自行重置的 VWAP
- javascript - 通过 CSS(网格支持)显示浏览器兼容性警报
- demo - 遥测适用于演示而不是在自己的服务器上
- r - 如何在 R 中时间序列图的点旁边添加值?
- android - Oreo 在一小时内安排通知
- java - 收集到列表,然后在 lambda 或消费者 java 8 中传递它
- python - 从python中的嵌套结构中构建一个带有pandas的数据框
- java - neo4j保存到数据库并在neo4j浏览器java中显示
- reactjs - 将 graphl 查询片段放入组件中的问题 (Gatsby+DatoCMS)
- eclipse - 如何部署 Eclipse 插件?