为什么查询执行计划中没有使用索引?

问题描述 投票:0回答:1

简单总结一下我遇到的问题,就是查询时索引不能正常工作,这只是数据库的差异。

我目前正在使用两个数据库。为了方便起见,我们将它们称为database1和database2。

还有会员表(TB_MBR_INFO)、聊天表(TB_CHAR_ROOM)等表。

TB_CHAT_ROOM 表包含卖家和买家会员 ID。

我想获取该会员ID的会员号。

所以我创建的查询如下。

SELECT 
    A.regdate AS REG_DT,
    (select MBR_NO from database2.TB_MBR_INFO USE INDEX (TB_MBR_INFO_MBR_ID_IDX) where MBR_ID = A.seller) AS SELL_MBR_NO,
    (select MBR_NO from database2.TB_MBR_INFO USE INDEX (TB_MBR_INFO_MBR_ID_IDX) where MBR_ID = A.buyer) AS PRCH_MBR_NO
FROM database1.TB_CHAT_ROOM A

但是,如果查看查询的执行计划,可能的_keys不存在,因此正在完全扫描成员表。

id|select_type       |table      |type |possible_keys|key                   |key_len|ref|rows  |Extra                   |
--+------------------+-----------+-----+-------------+----------------------+-------+---+------+------------------------+
 1|PRIMARY           |A          |ALL  |             |                      |       |   |474031|                        |
 4|DEPENDENT SUBQUERY|TB_MBR_INFO|index|             |TB_MBR_INFO_MBR_ID_IDX|62     |   |422098|Using where; Using index|
 3|DEPENDENT SUBQUERY|TB_MBR_INFO|index|             |TB_MBR_INFO_MBR_ID_IDX|62     |   |422098|Using where; Using index|

为了测试,我复制了聊天表并将其移至database2,索引应用正常。

SELECT 
    A.regdate AS REG_DT,
    (select MBR_NO from database2.TB_MBR_INFO USE INDEX (TB_MBR_INFO_MBR_ID_IDX) where MBR_ID = A.seller) AS SELL_MBR_NO,
    (select MBR_NO from database2.TB_MBR_INFO USE INDEX (TB_MBR_INFO_MBR_ID_IDX) where MBR_ID = A.buyer) AS PRCH_MBR_NO
FROM database2.TB_CHAT_ROOM A

id|select_type       |table      |type|possible_keys         |key                   |key_len|ref            |rows |Extra                   |
--+------------------+-----------+----+----------------------+----------------------+-------+---------------+-----+------------------------+
 1|PRIMARY           |A          |ALL |                      |                      |       |               |62721|                        |
 4|DEPENDENT SUBQUERY|TB_MBR_INFO|ref |TB_MBR_INFO_MBR_ID_IDX|TB_MBR_INFO_MBR_ID_IDX|62     |database2.A.buyer |1    |Using where; Using index|
 3|DEPENDENT SUBQUERY|TB_MBR_INFO|ref |TB_MBR_INFO_MBR_ID_IDX|TB_MBR_INFO_MBR_ID_IDX|62     |database2.A.seller|1    |Using where; Using index|

两者之间唯一的区别是数据库。列和索引都是相同的。

为了以防万一,我将所有内容都移至数据库 1 并进行了测试,但索引不起作用的问题仍然存在。

我真的很想解决这个问题。如果您知道原因,请不要忽视。

sql mysql indexing mariadb query-optimization
1个回答
0
投票

请为涉及的每个数据库中的每个表提供

SHOW CREATE TABLE

我会冒险说数据类型或排序规则存在不一致。

SHOWs
将有助于发现它。

© www.soinside.com 2019 - 2024. All rights reserved.