mysql多列索引不全用_MySQL没有为某些查询使用多列索引

博客讨论了MySQL中查询优化的问题,特别是在MyISAM表中使用不同索引的影响。当查询条件匹配部分复合索引时,MySQL选择了不同的索引。作者发现,尽管在小数据量下性能差异不大,但在大量数据中,正确选择索引对于查询速度至关重要。通过使用`USE INDEX`可以强制指定索引,但作者希望MySQL能自动选择最优的查询计划。
摘要由CSDN通过智能技术生成

我在MyISAM表中有一个包含数百万条

MySQL记录的表.非常简化,就像这样:

CREATE TABLE `test` (

`text` varchar(5) DEFAULT NULL,

`number` int(5) DEFAULT NULL,

KEY `number` (`number`) USING BTREE,

KEY `text_number` (`text`,`number`) USING BTREE

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

它填充了这些数据:

INSERT INTO `test` VALUES ('abcd', '1');

INSERT INTO `test` VALUES ('abcd', '2');

INSERT INTO `test` VALUES ('abcd', '3');

INSERT INTO `test` VALUES ('abcd', '4');

INSERT INTO `test` VALUES ('bbbb', '1');

INSERT INTO `test` VALUES ('bbbb', '2');

INSERT INTO `test` VALUES ('bbbb', '3');

当我运行以下查询时:

EXPLAIN SELECT * FROM `test` WHERE (`text` = 'bbbb' AND `number` = 2)

它返回’number’作为要使用的密钥.但是以下查询:

EXPLAIN SELECT * FROM `test` WHERE (`text` = 'bbbb' AND `number` = 1)

返回’text_number’作为使用的键,这对我来说更有意义,因为这个组合键与WHERE中的2列完全匹配.在这些记录数量上,性能不是问题,但在数百万条记录中,使用“text”索引的查询需要4秒,而使用“text_number”索引的查询在几毫秒内完成.

对此有合理的解释吗?如何更改MySQL使用索引的索引?我知道我可以使用USE INDEX,但我希望MySQL能够找到执行查询的最佳计划.这是在MySQL 5.1和5.5上,结果相同.

最佳答案 如果您希望某些查询能够改变游戏性能,那么最好使用自己的索引,例如:

EXPLAIN SELECT * FROM `test` USE INDEX (number) WHERE (`text` = 'bbbb' AND `number` = 1);

or

EXPLAIN SELECT * FROM `test` USE INDEX (text_number) WHERE (`text` = 'bbbb' AND `number` = 1);

通常,您可以在内置查询优化器中继续执行大多数查询,但对于关键或有问题的查询,最好仔细观察.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值