Mysql 简单的子查询可以降低大型表的速度

Mysql 简单的子查询可以降低大型表的速度,mysql,sql,database,Mysql,Sql,Database,所以我得到了一个mysql数据库,它有两个表,一个sd_客户端,有大约24k个条目: 创建表“sd_客户端” `ms_id`varchar10不为空, `ms_share_id`varchar10不为空, `短_name`varchar25默认为空, `标准_name`varchar75默认为空, `法定名称'varchar150默认为空, `country`varchar4默认为空, `状态'tinyint1 DEFAULT NULL COMMENT'1=付费客户| 2=非付费客户', `用

所以我得到了一个mysql数据库,它有两个表,一个sd_客户端,有大约24k个条目:

创建表“sd_客户端” `ms_id`varchar10不为空, `ms_share_id`varchar10不为空, `短_name`varchar25默认为空, `标准_name`varchar75默认为空, `法定名称'varchar150默认为空, `country`varchar4默认为空, `状态'tinyint1 DEFAULT NULL COMMENT'1=付费客户| 2=非付费客户', `用户_id`int11默认为空, `摘要`案文, `扇区'int4默认为空, `sub_扇区'int4默认为空, `业务_country`char3默认为空, `在“日期默认为空”时创建了_, `|u paid`int1 NOT NULL默认值'0'注释'0=非付费客户| 1=付费客户', `说明_en `文本, `说明_zh-hans`文本, `说明_zh-hant`文本, `突出显示文本, `突出显示_zh-hans的文字, `突出显示_zh-hant`文本, `logo`varchar255默认为空, `摘要小节标题varchar500默认为空, `摘要小节标题hans`varchar500默认为空, `摘要小节标题“varchar500默认为空”, `摘要(分节)正文(正文), `摘要、小节、正文、正文、, `摘要、小节、正文、正文、, `summary_short_en`varchar2000默认为空, `summary_short_zh-hans`varchar2000默认为空, `summary_short_zh-hant`varchar2000默认为空, `其他信息文本, `其他信息, `其他信息文本, `更改百分比`小数点10,3默认为空, `id_扇区'bigint3默认为空, `id_subsector`bigint3默认为空, `背景信息文本, `背景信息zh-hans`文本, `背景信息文本, `share_id_显示'varchar10默认为空, 主键`ms_id`键块大小=1024, 唯一键`ms\u id``ms\u id`KEY\u BLOCK\u SIZE=1024, KEY`share\u id\u displated``share\u id\u displated`KEY\u BLOCK\u SIZE=1024 引擎=MyISAM默认字符集=utf8mb4行\格式=压缩键\块\大小=8;
设置外键检查=1 您最好基于当前子查询加入一个不相关的子查询;使用这种技术在新的子查询中为每个查询查找最新的行

编辑:我想的更多是这样的:

SELECT DISTINCT sd_clients.ms_id, sd_clients.standard_name, sd_clients.is_paid, sd_clients.logo, sd_clients.change_percentage
    , scdsB.items
FROM sd_clients 
INNER JOIN ( 
    SELECT scdsA.ms_share_id
        , CONCAT(
            scdsA.`exchange_id`, '|--|', scdsA.`symbol`, '|--|', 
            scdsA.`close_price`, '|--|', scdsA.`day_low`, '|--|', scdsA.`day_high`
        ) as items
    FROM sd_clients_daily_stocks AS scdsA
    INNER JOIN (
        SELECT ms_share_id, MAX(created_at)
        FROM sd_clients_daily_stocks
        GROUP BY ms_share_id 
    ) AS lasts
    ON scdsA.ms_share_id = lasts.ms_share_id
    AND scdsA.created_at = lasts.created_at
) scdsB 
ON sd_clients.share_id_displayed = scdsB.ms_share_id 
GROUP BY sd_clients.ms_id 
ORDER BY sd_clients.standard_name ASC 
LIMIT 10;

。。。但即使这样,也不会使速度从12秒减少更多(如果有的话)。在这一点上,你最好去寻找有帮助的索引。例如,查找每个ms_share_id值最近创建的最大值的最后一个分组子查询将受益于sd_Client_daily_stocks ms_shared_id上的索引,该索引在使用它的联接时创建。

您应该尝试在sd_Client_daily_stocks SMS_share_id上创建索引


如果你想要一个覆盖索引,你可以从select中添加额外的列。

我试过了,它缩短到12秒左右,还是太长了。选择不同的sd_客户端。ms_id、sd_客户端。标准_名称、sd_客户端。是否付费、sd_客户端。徽标、sd_客户端。更改_百分比,scds.*从sd_客户加入从sd_客户中选择ms_共享id从sd_客户中选择ms_每日股票组由ms_共享id在sd_客户上选择scds。共享id显示=scds.ms_共享id组由sd_客户。ms_id订单由sd_客户。标准名称ASC限额10@BrunoPereira . . . 一个索引,两列按指定顺序排列。与CREATE TABLE语句一样,有关查询性能的问题总是需要解释相同的内容。而你的分组条款是毫无意义的。