Home > Database > Mysql Tutorial > body text

Detailed explanation of subquery examples encountered in mysql in the production library

黄舟
Release: 2017-08-13 10:56:46
Original
1127 people have browsed it

DBAs or developers who have used Oracle or other relational databases all have this experience. They all think that the database has been optimized for subqueries and can make good choices to drive table execution, and then transplant this experience to mysql. database, but unfortunately, mysql may disappoint you in the processing of subqueries. In our production system, we encountered this problem:

select  i_id, sum(i_sell) as i_sell
from table_data
where i_id in (select i_id from table_data where Gmt_create >= ‘2011-10-07 00:00:00’)
group by i_id;
Copy after login

(Note: The business logic of sql can For example: first query the 100 books newly sold on 10-07, and then query the sales of these 100 newly sold books throughout the year).

The performance problem of this SQL is due to the weakness of the mysql optimizer in processing subqueries. When the mysql optimizer processes subqueries, it will rewrite the subqueries. Normally, we hope to complete the results of the subquery from the inside to the outside first, and then use the subquery to drive the outer query table to complete the query; but mysql processing will first scan all the data in the outer table, and each The data will be transferred to the subquery and associated with the subquery. If the table is very large, there will be performance problems;

For the above query, since the data in the table_data table has 70W of data, At the same time, there is a lot of data in the subquery, and a large amount of it is repeated, which requires nearly 700,000 correlations. The large number of correlations causes this sql to be executed for several hours without being completed, so we need to rewrite the sql:

SELECT t2.i_id, SUM(t2.i_sell) AS sold
FROM (SELECT distinct i_id FROM table_data
WHERE gmt_create >= ‘2011-10-07 00:00:00’) t1,  table_data t2
WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
Copy after login

We changed the subquery to association, and added distinct to the subquery to reduce the number of times t1 is associated with t2;

After the transformation, the execution time of sql dropped to less than 100ms.

The above is the detailed content of Detailed explanation of subquery examples encountered in mysql in the production library. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!