mysql 忽略索引_mysql – mariadb忽略强制索引

我正在尝试调整一个相对简单的查询:

select bt.col1,bt.col2

from bigtable bt

join smalltable st on bt.smalltable_id = st.smalltable_id

where st.name = 'some name occuring only once in st'

limit 10

bigtable中的匹配数量与总体规模相比相对较小(<1%)

这是解释计划:

+------+-------------+-------+--------+-----------------+---------+---------+-----------------+----------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+------+-------------+-------+--------+-----------------+---------+---------+-----------------+----------+-------------+

| 1 | PRIMARY | bt | ALL | ix_smalltable_id| NULL | NULL | NULL | 22709766 | Using where |

| 1 | PRIMARY | st | eq_ref | PRIMARY,ix_name | PRIMARY | 2 | bt.smalltable_id| 1 | Using where |

+------+-------------+-------+--------+-----------------+---------+---------+-----------------+----------+-------------+

不知何故,尽管拾取索引会更容易,但事实并非如此.

然后我试图强制索引:

select bt.col1,bt.col2

from bigtable bt force index (ix_smalltable_id)

join smalltable st on bt.smalltable_id = st.smalltable_id

where st.name = 'some name occuring only once in st'

limit 10

但查询计划和查询时间是一样的.它不想使用索引.

我尝试在(select …)中执行bt.smalltable_id,但查询计划和时间相同.

但是如果我首先获取smalltable_id,然后将其嵌入到select中,它会快得多.

这个问题

我可以通过启用一些标志强制索引吗?这是查询引擎的限制吗?

表结构

CREATE TABLE `smalltable` (

`smalltable_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`smalltable_id`),

KEY `ix_name` (`name`(10))

) ENGINE=InnoDB AUTO_INCREMENT=5698 DEFAULT CHARSET=utf8

CREATE TABLE `bigtable` (

`bigtable_id` bigint unsigned NOT NULL AUTO_INCREMENT,

`col1` varchar(255) DEFAULT NULL,

`col2` varchar(255) DEFAULT NULL,

...

`smalltable_id` smallint(5) unsigned DEFAULT NULL,

PRIMARY KEY (`bigtable_id`),

KEY `ix_smalltable_id` (`smalltable_id`)

) ENGINE=InnoDB AUTO_INCREMENT=23167374 DEFAULT CHARSET=utf8

解决方法:

我很确定问题是“部分”索引:

CREATE TABLE `smalltable` (

...

KEY `ix_name` (`name`(10))

)

尝试在列的整个长度上添加索引后运行查询:

ALTER TABLE smalltable

DROP INDEX ix_name

, ADD INDEX ix_name_full (name) ;

标签:query-performance,mysql,mariadb,index

来源: https://codeday.me/bug/20190807/1605569.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值