Hi,

i have now created the index, the select now takes only a few seconds instead 
of more than a minute.

please check and maybe include the index into next bacula version, its a cheap 
index, but it helps if you have many jobs (>100000) and use accurate backups.


MariaDB [bacula]> CREATE INDEX jobtdate_idx on Job (JobTDate);

MariaDB [bacula]> explain SELECT Path.Path, Filename.Name, T1.FileIndex, 
T1.JobId, LStat, DeltaSeq      FROM ( SELECT FileId, Job.JobId AS JobId, 
FileIndex, File.PathId AS PathId, File.FilenameId AS FilenameId, LStat     , 
DeltaSeq, Job.JobTDate AS JobTDate FROM Job, File, ( SELECT MAX(JobTDate) AS 
JobTDate, PathId, FilenameId FROM ( SELECT JobTDate, PathId, FilenameId FROM 
File JOIN Job USING (JobId) WHERE File.JobId IN 
(1141112,1141820,1142374,1143005) UNION ALL SELECT JobTDate, PathId, FilenameId 
FROM BaseFiles JOIN File USING (FileId) JOIN Job  ON    (BaseJobId = Job.JobId) 
WHERE BaseFiles.JobId IN (1141112,1141820,1142374,1143005) ) AS tmp GROUP BY 
PathId, FilenameId ) AS T1 WHERE (Job.JobId IN ( SELECT DISTINCT BaseJobId FROM 
BaseFiles WHERE JobId IN (1141112,1141820,1142374,1143005)) OR Job.JobId IN 
(1141112,1141820,1142374,1143005)) AND T1.JobTDate = Job.JobTDate AND Job.JobId 
= File.JobId AND T1.PathId = File.PathId AND T1.FilenameId = File.FilenameId ) 
AS T1 JOIN Filename O
 N (Filename.FilenameId = T1.FilenameId) JOIN Path ON (Path.PathId = T1.PathId) 
WHERE FileIndex > 0 ORDER BY T1.JobTDate, FileIndex ASC;
+------+--------------+------------+--------+----------------------+--------------+---------+------------------------------------------+--------+-----------------------------------------------------------+
| id   | select_type  | table      | type   | possible_keys        | key        
  | key_len | ref                                      | rows   | Extra         
                                            |
+------+--------------+------------+--------+----------------------+--------------+---------+------------------------------------------+--------+-----------------------------------------------------------+
|    1 | SIMPLE       | Job        | index  | PRIMARY,jobtdate_idx | 
jobtdate_idx | 9       | NULL                                     | 193606 | 
Using where; Using index; Using temporary; Using filesort |
|    1 | SIMPLE       | <derived3> | ref    | key0                 | key0       
  | 9       | bacula.Job.JobTDate                      |     10 |               
                                            |
|    1 | SIMPLE       | Path       | eq_ref | PRIMARY              | PRIMARY    
  | 4       | T1.PathId                                |      1 |               
                                            |
|    1 | SIMPLE       | Filename   | eq_ref | PRIMARY              | PRIMARY    
  | 4       | T1.FilenameId                            |      1 |               
                                            |
|    1 | SIMPLE       | File       | ref    | JobId,JobId_2        | JobId_2    
  | 12      | bacula.Job.JobId,T1.PathId,T1.FilenameId |      1 | Using where   
                                            |
|    6 | MATERIALIZED | BaseFiles  | ALL    | basefiles_jobid_idx  | NULL       
  | NULL    | NULL                                     |      1 | Using where   
                                            |
|    3 | DERIVED      | <derived4> | ALL    | NULL                 | NULL       
  | NULL    | NULL                                     |  83357 | Using 
temporary; Using filesort                           |
|    4 | DERIVED      | Job        | range  | PRIMARY              | PRIMARY    
  | 4       | NULL                                     |      4 | Using where   
                                            |
|    4 | DERIVED      | File       | ref    | JobId,JobId_2        | JobId_2    
  | 4       | bacula.Job.JobId                         |  20839 | Using index   
                                            |
|    5 | UNION        | BaseFiles  | ALL    | basefiles_jobid_idx  | NULL       
  | NULL    | NULL                                     |      1 | Using where   
                                            |
|    5 | UNION        | Job        | eq_ref | PRIMARY              | PRIMARY    
  | 4       | bacula.BaseFiles.BaseJobId               |      1 |               
                                            |
|    5 | UNION        | File       | eq_ref | PRIMARY              | PRIMARY    
  | 8       | bacula.BaseFiles.FileId                  |      1 |               
                                            |
| NULL | UNION RESULT | <union4,5> | ALL    | NULL                 | NULL       
  | NULL    | NULL                                     |   NULL |               
                                            |
+------+--------------+------------+--------+----------------------+--------------+---------+------------------------------------------+--------+-----------------------------------------------------------+

Best regards
Ulrich


> Ulrich Leodolter <ulrich.leodol...@obvsg.at> hat am 27. April 2017 um 08:37 
> geschrieben:
> 
> 
> Hi,
> 
> Every night we see new entries in mysql slow-query log which look like this:
> 
> # Query_time: 72.057146  Lock_time: 0.000240  Rows_sent: 1454850  
> Rows_examined: 17178331
> SET timestamp=1493248276;
> SELECT Path.Path, Filename.Name, T1.FileIndex, T1.JobId, LStat, DeltaSeq      
> FROM ( SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, 
> File.FilenameId AS FilenameId, LStat     , DeltaSeq, Job.JobTDate AS JobTDate 
> FROM Job, File, ( SELECT MAX(JobTDate) AS JobTDate, PathId, FilenameId FROM ( 
> SELECT JobTDate, PathId, FilenameId FROM File JOIN Job USING (JobId) WHERE 
> File.JobId IN (1141112,1141820,1142374,1143005) UNION ALL SELECT JobTDate, 
> PathId, FilenameId FROM BaseFiles JOIN File USING (FileId) JOIN Job  ON    
> (BaseJobId = Job.JobId) WHERE BaseFiles.JobId IN 
> (1141112,1141820,1142374,1143005) ) AS tmp GROUP BY PathId, FilenameId ) AS 
> T1 WHERE (Job.JobId IN ( SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId 
> IN (1141112,1141820,1142374,1143005)) OR Job.JobId IN 
> (1141112,1141820,1142374,1143005)) AND T1.JobTDate = Job.JobTDate AND 
> Job.JobId = File.JobId AND T1.PathId = File.PathId AND T1.FilenameId = 
> File.FilenameId ) AS T1 JOIN Filename ON (Filename.FilenameId =
  T
>  1.FilenameId) JOIN Path ON (Path.PathId = T1.PathId) WHERE FileIndex > 0 
> ORDER BY T1.JobTDate, FileIndex ASC;
> 
> We run Full backup on Saturday followed by 6 Incremental to Disk followed by 
> Copy jobs to Tape. Below are a few numbers about our database,  the server 
> runs Bacula 7.4.7 on CentOS 7.3, 128GB Ram, Intel(R) Xeon(R) CPU E5-2620 v3 @ 
> 2.40GHz.  Database index is almost in memory, InnoDB is used as storage 
> engine (one file per table) and i don't see any disk activity while the above 
> SELECT is running.
> 
> Is the query really slow related to database size, or is it just slow on 
> mariadb 5.5.52, or would a new index or modified help?  
> 
> Maybe an index on Job.JobTDate would help,  JobHisto.JobTDate is indexed ?
> 
> 
> $ du -h -s /var/lib/mysql/bacula/
> 316G  /var/lib/mysql/bacula/
> 
> MariaDB [bacula]> select count(*) from File;
> +------------+
> | count(*)   |
> +------------+
> | 2005237279 |
> +------------+
> MariaDB [bacula]> select count(*) from Filename;
> select cou+----------+
> | count(*) |
> +----------+
> | 50002655 |
> +----------+
> 1 row in set (7.00 sec)
> 
> MariaDB [bacula]> select count(*) from Job;
> +----------+
> | count(*) |
> +----------+
> |   189213 |
> +----------+
> 
> MariaDB [bacula]> explain SELECT Path.Path, Filename.Name, T1.FileIndex, 
> T1.JobId, LStat, DeltaSeq      FROM ( SELECT FileId, Job.JobId AS JobId, 
> FileIndex, File.PathId AS PathId, File.FilenameId AS FilenameId, LStat     , 
> DeltaSeq, Job.JobTDate AS JobTDate FROM Job, File, ( SELECT MAX(JobTDate) AS 
> JobTDate, PathId, FilenameId FROM ( SELECT JobTDate, PathId, FilenameId FROM 
> File JOIN Job USING (JobId) WHERE File.JobId IN 
> (1141112,1141820,1142374,1143005) UNION ALL SELECT JobTDate, PathId, 
> FilenameId FROM BaseFiles JOIN File USING (FileId) JOIN Job  ON    (BaseJobId 
> = Job.JobId) WHERE BaseFiles.JobId IN (1141112,1141820,1142374,1143005) ) AS 
> tmp GROUP BY PathId, FilenameId ) AS T1 WHERE (Job.JobId IN ( SELECT DISTINCT 
> BaseJobId FROM BaseFiles WHERE JobId IN (1141112,1141820,1142374,1143005)) OR 
> Job.JobId IN (1141112,1141820,1142374,1143005)) AND T1.JobTDate = 
> Job.JobTDate AND Job.JobId = File.JobId AND T1.PathId = File.PathId AND 
> T1.FilenameId = File.FilenameId ) AS T1 JOIN Filename
  O
>  N (Filename.FilenameId = T1.FilenameId) JOIN Path ON (Path.PathId = 
> T1.PathId) WHERE FileIndex > 0 ORDER BY T1.JobTDate, FileIndex ASC;
> +------+--------------+------------+--------+---------------------+---------+---------+------------------------------------------+--------+----------------------------------------------+
> | id   | select_type  | table      | type   | possible_keys       | key     | 
> key_len | ref                                      | rows   | Extra           
>                              |
> +------+--------------+------------+--------+---------------------+---------+---------+------------------------------------------+--------+----------------------------------------------+
> |    1 | SIMPLE       | Job        | ALL    | PRIMARY             | NULL    | 
> NULL    | NULL                                     | 193606 | Using where; 
> Using temporary; Using filesort |
> |    1 | SIMPLE       | <derived3> | ref    | key0                | key0    | 
> 9       | bacula.Job.JobTDate                      |     10 |                 
>                              |
> |    1 | SIMPLE       | Path       | eq_ref | PRIMARY             | PRIMARY | 
> 4       | T1.PathId                                |      1 |                 
>                              |
> |    1 | SIMPLE       | Filename   | eq_ref | PRIMARY             | PRIMARY | 
> 4       | T1.FilenameId                            |      1 |                 
>                              |
> |    1 | SIMPLE       | File       | ref    | JobId,JobId_2       | JobId_2 | 
> 12      | bacula.Job.JobId,T1.PathId,T1.FilenameId |      1 | Using where     
>                              |
> |    6 | MATERIALIZED | BaseFiles  | ALL    | basefiles_jobid_idx | NULL    | 
> NULL    | NULL                                     |      1 | Using where     
>                              |
> |    3 | DERIVED      | <derived4> | ALL    | NULL                | NULL    | 
> NULL    | NULL                                     |  83357 | Using 
> temporary; Using filesort              |
> |    4 | DERIVED      | Job        | range  | PRIMARY             | PRIMARY | 
> 4       | NULL                                     |      4 | Using where     
>                              |
> |    4 | DERIVED      | File       | ref    | JobId,JobId_2       | JobId_2 | 
> 4       | bacula.Job.JobId                         |  20839 | Using index     
>                              |
> |    5 | UNION        | BaseFiles  | ALL    | basefiles_jobid_idx | NULL    | 
> NULL    | NULL                                     |      1 | Using where     
>                              |
> |    5 | UNION        | Job        | eq_ref | PRIMARY             | PRIMARY | 
> 4       | bacula.BaseFiles.BaseJobId               |      1 |                 
>                              |
> |    5 | UNION        | File       | eq_ref | PRIMARY             | PRIMARY | 
> 8       | bacula.BaseFiles.FileId                  |      1 |                 
>                              |
> | NULL | UNION RESULT | <union4,5> | ALL    | NULL                | NULL    | 
> NULL    | NULL                                     |   NULL |                 
>                              |
> +------+--------------+------------+--------+---------------------+---------+---------+------------------------------------------+--------+----------------------------------------------+
> 13 rows in set (0.00 sec)
> 
> 
> Best regards
> Ulrich

Ulrich Leodolter <ulrich.leodol...@obvsg.at>
Oesterreichische Bibliothekenverbund und Service GmbH
Raimundgasse 1/3, A-1020 Wien
Fax +43 1 4035158-30
Tel +43 1 4035158-21
Web http://www.obvsg.at

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Bacula-devel mailing list
Bacula-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-devel

Reply via email to