【问题标题】:SQL query optimization for MySql databaseMySql 数据库的 SQL 查询优化
【发布时间】:2015-01-18 12:16:21
【问题描述】:

我有 3 个表:用户、公司和交易。

一个用户可能拥有多家公司。两家公司之间达成交易。我需要一份涉及我公司的交易清单。

交易必须包含以下字段:partner_company_id、my_company_id、partner_photo、partner_name、deal_about。

语言代码:PHP。 数据库:Mysql。

1.我可以通过用户ID获得的公司列表

user_id = 22;

companyList = query('SELECT company_id FROM company WHERE user_id = ?', user_id);

2。然后我得到 my_company_id 是 company_first_id 的交易列表

 list1 = query('SELECT u.name AS partner_name, u.photo AS partner_photo, d.first_company_id AS 

    my_company_id , d.second_company_id AS partner_company_id,d.about AS deal_about FROM deal AS d

    INNER JOIN company AS c ON c.company_id = d.second_company_id

    INNER JOIN user AS u ON u.user_ud = c.user_id 

    WHERE d.company_first_id IN (?)', companyList);

3.然后我得到 my_company_id 是 company_second_id 的交易列表

 list2 = query('SELECT u.name AS partner_name, u.photo AS partner_photo, d.first_company_id AS 

partner_company_id , d.second_company_id AS my_company_id,d.about AS deal_about FROM deal AS d
    INNER JOIN company AS c ON c.company_id = d.first_company_id
    INNER JOIN user AS u ON u.user_ud = c.user_id 
    WHERE d.company_second_id IN (?)', companyList);

4.然后我marge到数组并设置限制列表

list = array_marge(list1,list2);
result = array_slice (list ,0 , 10);

帮助,请优化此查询。

谢谢。

数据库方案

      user      |    company     |      deal     |
--------------------------------------------------         
user_d          | company_id     | deal_id
photo           | user_id        |first_company_id
name            | about          |second_company_id 
                |                |description

【问题讨论】:

  • 我认为让别人为你做所有的工作是很不礼貌的。很好的问题是:我有这个优化的想法,这会奏效还是你知道一些改进?或者:有没有关于查询优化的好书?
  • 我们不是来做你的工作的。你有什么理由怀疑这些查询可以优化吗?关于从哪里开始有什么想法吗?

标签: php mysql sql database optimization


【解决方案1】:

您的查询这么慢吗?它们看起来并不慢(当然,前提是您对所有 ID 都有索引)。

但是,您可以通过组合两个交易查询来节省一次数据库访问。要么直接选择query1 UNION ALL query1,要么一次性完成:

select
  u.name AS partner_name, 
  u.photo AS partner_photo, 
  d.my_company_id,
  d.partner_company_id,
  d.about AS deal_about 
from
(
  select 
    about, 
    case when company_first_id in (?) then
      company_first_id 
    else 
      company_second_id 
    end as my_company_id,
    case when company_first_id in (?) then
       company_second_id 
    else 
      company_first_id
    end as partner_company_id
  from deal
  where company_first_id in (?) OR d.company_second_id in (?)
) as d
inner join company as c on c.company_id = d.partner_company_id
inner join user as u on u.user_ud = c.user_id 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多