数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题

基础概念

派生表是从SELECT语句返回的虚拟表。派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。

术语:*派生表*和子查询通常可互换使用。当SELECT语句的FROM子句中使用独立子查询时,我们将其称为派生表。

以下说明了使用派生表的查询:

请注意,独立子查询是一个子查询,可独立于包含该语句的执行语句!与子查询不同,派生表必须具有别名

实例中的例子

下面是一个派生表的例子

复制代码
EXPLAIN SELECT
    *
FROM
    (
        SELECT
            companyid,
            count(*)
        FROM
            system_company where CompanyId=1
    ) as a
limit 10
复制代码

EXPLAIN 这个执行计划中可以发展,派生表没有走索引

事实上,这个问题告诉我们,在数据量大的时候,不要使用派生表,那么应该使用什么呢?

下面请看子查询的例子

复制代码
EXPLAIN SELECT 
    (
        SELECT
            companyid
        FROM
            system_company
        WHERE
            CompanyId = a.companyid
        LIMIT 1
    ) as field1
FROM system_company  AS a
where companyid=1
复制代码

通过查询计划可以看到,它是走索引的,所有执行效率自然快!

在我们进行分组统计时,也应该尽量使用子查询,而不是派生表,看下面的例子,分别实现了对公司进行统计,将system_companydetails里的数量求和

派生表(全表扫描,效率低下):

复制代码
EXPLAIN SELECT
    s.companyid,a.count
FROM system_company s
inner join 
    (
        SELECT
            companyid,
            count(*) as count
        FROM
            system_companydetails
     
    ) AS a on s.companyid=a.companyid
LIMIT 10 

 
复制代码

子查询(索引聚合,值得推荐):

复制代码
EXPLAIN SELECT
    s.companyid,
    (
        SELECT
            count(*)
        FROM
            system_companydetails
        WHERE
            companyid = s.companyid
    ) AS count
FROM
    system_company s
where companyid=1
复制代码

感谢各位的阅读与分析!

有问题欢迎讨论!

 

posted @   张占岭  阅读(2638)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2012-03-09 你必须要知识的架构知识~第四章 抽象类展现代码的层次感
点击右上角即可分享
微信分享提示