jcrespo added a subscriber: jcrespo.
jcrespo added a comment.

Yes, for this particular case (machine, table and parameters), not using a 
FORCE INDEX will be better:

With FORCE:

  mysql> EXPLAIN SELECT  
rc_id,rc_timestamp,rc_namespace,rc_title,rc_cur_id,rc_type,rc_deleted,rc_this_oldid,rc_last_oldid,rc_comment,rc_user,rc_user_text,rc_minor,rc_type,rc_bot,rc_old_len,rc_new_len,rc_logid,rc_log_type,rc_log_action,rc_params,page_is_redirect
  FROM `recentchanges` FORCE INDEX (rc_timestamp) LEFT JOIN `page` ON 
((rc_namespace=page_namespace) AND (rc_title=page_title))  WHERE rc_namespace 
IN ('6','7')  AND rc_type IN ('0','1','3')   ORDER BY rc_timestamp DESC,rc_id 
DESC LIMIT 6\G
  *************************** 1. row ***************************
             id: 1
    select_type: SIMPLE
          table: recentchanges
           type: index
  possible_keys: NULL
            key: rc_timestamp
        key_len: 16
            ref: NULL
           rows: 6
          Extra: Using where
  *************************** 2. row ***************************
             id: 1
    select_type: SIMPLE
          table: page
           type: eq_ref
  possible_keys: name_title
            key: name_title
        key_len: 261
            ref: 
wikidatawiki.recentchanges.rc_namespace,wikidatawiki.recentchanges.rc_title
           rows: 1
          Extra: 
  2 rows in set (0.02 sec)
  
  Execution time:
  Empty set (20.50 sec)
  
  PAGER set to stdout
  +----------------------------+---------+
  | Variable_name              | Value   |
  +----------------------------+---------+
  | Handler_commit             | 1       |
  | Handler_delete             | 0       |
  | Handler_discover           | 0       |
  | Handler_external_lock      | 0       |
  | Handler_icp_attempts       | 0       |
  | Handler_icp_match          | 0       |
  | Handler_mrr_init           | 0       |
  | Handler_mrr_key_refills    | 0       |
  | Handler_mrr_rowid_refills  | 0       |
  | Handler_prepare            | 0       |
  | Handler_read_first         | 0       |
  | Handler_read_key           | 0       |
  | Handler_read_last          | 1       |
  | Handler_read_next          | 0       |
  | Handler_read_prev          | 6847234 |
  | Handler_read_rnd           | 0       |
  | Handler_read_rnd_deleted   | 0       |
  | Handler_read_rnd_next      | 0       |
  | Handler_rollback           | 0       |
  | Handler_savepoint          | 0       |
  | Handler_savepoint_rollback | 0       |
  | Handler_tmp_update         | 0       |
  | Handler_tmp_write          | 0       |
  | Handler_update             | 0       |
  | Handler_write              | 0       |
  +----------------------------+---------+
  25 rows in set (0.00 sec)
  
  mysql> SHOW PROFILE FOR QUERY 2;
  +----------------------+-----------+
  | Status               | Duration  |
  +----------------------+-----------+
  | starting             |  0.000133 |
  | checking permissions |  0.000009 |
  | checking permissions |  0.000007 |
  | Opening tables       |  0.000023 |
  | After opening tables |  0.000010 |
  | System lock          |  0.000008 |
  | Table lock           |  0.000066 |
  | After table lock     |  0.000009 |
  | init                 |  0.000050 |
  | optimizing           |  0.000021 |
  | statistics           |  0.000034 |
  | preparing            |  0.000034 |
  | executing            |  0.000007 |
  | Sorting result       |  0.000010 |
  | Sending data         | 22.417293 |
  | end                  |  0.000028 |
  | query end            |  0.000013 |
  | closing tables       |  0.000029 |
  | freeing items        |  0.000017 |
  | updating status      |  0.000033 |
  | logging slow query   |  0.000014 |
  | cleaning up          |  0.000012 |
  +----------------------+-----------+
  22 rows in set (0.00 sec)

Without force:

  mysql> EXPLAIN SELECT  
rc_id,rc_timestamp,rc_namespace,rc_title,rc_cur_id,rc_type,rc_deleted,rc_this_oldid,rc_last_oldid,rc_comment,rc_user,rc_user_text,rc_minor,rc_type,rc_bot,rc_old_len,rc_new_len,rc_logid,rc_log_type,rc_log_action,rc_params,page_is_redirect
  FROM `recentchanges` LEFT JOIN `page` ON ((rc_namespace=page_namespace) AND 
(rc_title=page_title))  WHERE rc_namespace IN ('6','7')  AND rc_type IN 
('0','1','3')   ORDER BY rc_timestamp DESC,rc_id DESC LIMIT 6\G
  *************************** 1. row ***************************
             id: 1
    select_type: SIMPLE
          table: recentchanges
           type: range
  possible_keys: rc_namespace_title,rc_ns_usertext,tmp_3
            key: rc_namespace_title
        key_len: 4
            ref: NULL
           rows: 2
          Extra: Using index condition; Using where; Using filesort
  *************************** 2. row ***************************
             id: 1
    select_type: SIMPLE
          table: page
           type: eq_ref
  possible_keys: name_title
            key: name_title
        key_len: 261
            ref: 
wikidatawiki.recentchanges.rc_namespace,wikidatawiki.recentchanges.rc_title
           rows: 1
          Extra: 
  2 rows in set (0.15 sec)
  
  Execution time:
  Empty set (0.00 sec)
  
  PAGER set to stdout
  +----------------------------+-------+
  | Variable_name              | Value |
  +----------------------------+-------+
  | Handler_commit             | 1     |
  | Handler_delete             | 0     |
  | Handler_discover           | 0     |
  | Handler_external_lock      | 0     |
  | Handler_icp_attempts       | 0     |
  | Handler_icp_match          | 0     |
  | Handler_mrr_init           | 0     |
  | Handler_mrr_key_refills    | 0     |
  | Handler_mrr_rowid_refills  | 0     |
  | Handler_prepare            | 0     |
  | Handler_read_first         | 0     |
  | Handler_read_key           | 2     |
  | Handler_read_last          | 0     |
  | Handler_read_next          | 0     |
  | Handler_read_prev          | 0     |
  | Handler_read_rnd           | 0     |
  | Handler_read_rnd_deleted   | 0     |
  | Handler_read_rnd_next      | 0     |
  | Handler_rollback           | 0     |
  | Handler_savepoint          | 0     |
  | Handler_savepoint_rollback | 0     |
  | Handler_tmp_update         | 0     |
  | Handler_tmp_write          | 0     |
  | Handler_update             | 0     |
  | Handler_write              | 0     |
  +----------------------------+-------+
  25 rows in set (0.00 sec)
  
  mysql> SHOW PROFILE FOR QUERY 6;
  +----------------------+----------+
  | Status               | Duration |
  +----------------------+----------+
  | starting             | 0.000127 |
  | checking permissions | 0.000010 |
  | checking permissions | 0.000008 |
  | Opening tables       | 0.000037 |
  | After opening tables | 0.000011 |
  | System lock          | 0.000009 |
  | Table lock           | 0.000009 |
  | After table lock     | 0.000010 |
  | init                 | 0.000059 |
  | optimizing           | 0.000025 |
  | statistics           | 0.000126 |
  | preparing            | 0.000043 |
  | executing            | 0.000009 |
  | Sorting result       | 0.000046 |
  | Sending data         | 0.000040 |
  | end                  | 0.000010 |
  | query end            | 0.000012 |
  | closing tables       | 0.000013 |
  | freeing items        | 0.000012 |
  | updating status      | 0.000033 |
  | cleaning up          | 0.000009 |
  +----------------------+----------+
  21 rows in set (0.00 sec)

However, are you sure it wouldn't affect the same query with other parameters 
(edge cases)?

Maybe it is needed in 5.5 but not in 10/5.6. Maybe it is needed when page 
sampling is wrong. FORCE index is a (sometimes necessary) evil, due usually to 
the lack of documentation of why it was set there.

My point of view would be to prove it statistically- set one of our machines 
with a proposed change and use pt-query-digest 
<https://wikitech.wikimedia.org/wiki/MariaDB/query_performance> (example output 
<https://wikitech.wikimedia.org/wiki/MariaDB/parsercache>) or 
performance_schema to prove it is better overall and with no regression in a 
controlled environment, over a long period of time.

We are trying to improve the process on our side to better help you with this, 
too.


TASK DETAIL
  https://phabricator.wikimedia.org/T101502

EMAIL PREFERENCES
  https://phabricator.wikimedia.org/settings/panel/emailpreferences/

To: jcrespo
Cc: jcrespo, Anomie, Aklapper, jayvdb, Krenair, Legoktm, greg, pywikipedia-bugs



_______________________________________________
pywikibot-bugs mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot-bugs

Reply via email to