Hello Ulrich,

This is just to let you know that I have added the Job index on JobTDate 
that you suggested in the next major version of Bacula (9.0.0) due to be 
released in June 2017.  Thanks for the good idea.

For others who read this.  Please be very careful about adding indexes 
particularly on the File table.  In this case, the new index has no 
adverse interactions.  In other cases, adding a new index can speed up a 
particular search or insert, but will often have very negative 
consequences for other operations.

Best regards,

Kern


On 04/27/2017 08:55 AM, Ulrich Leodolter wrote:
> 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 Filenam
 e
>    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
>



------------------------------------------------------------------------------
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