Mysql 如何改进索引表的慢速查询?
此查询平均需要2/3秒。join中的每个字段和where都是索引 如何改进此查询Mysql 如何改进索引表的慢速查询?,mysql,sql,mariadb,Mysql,Sql,Mariadb,此查询平均需要2/3秒。join中的每个字段和where都是索引 如何改进此查询 SELECT DISTINCT pro_id, pro_url, pro_data, pro_capa, pro_destaque, pro_destaque_data, pro_nome, pro_likes, pro_views, pro_comentarios_total, pro_autor FROM projeto JOIN utilizador_projeto ON pro_id=utp_proid J
SELECT DISTINCT pro_id, pro_url, pro_data, pro_capa, pro_destaque, pro_destaque_data, pro_nome, pro_likes, pro_views, pro_comentarios_total, pro_autor FROM projeto JOIN utilizador_projeto ON pro_id=utp_proid JOIN utilizador ON utp_utiid=uti_id WHERE pro_activo=1 AND pro_privacidade=1 ORDER BY pro_destaque_data DESC LIMIT 24;
慢速查询日志:
# Time: 190923 1:10:58
# User@Host: root[root] @ [10.133.247.241]
# Thread_id: 36 Schema: db QC_hit: No
# Query_time: 3.575462 Lock_time: 0.000114 Rows_sent: 24 Rows_examined: 104820
# Rows_affected: 0 Bytes_sent: 3974
MariaDB [db]> EXPLAIN SELECT DISTINCT pro_id, pro_url, pro_data, pro_capa, pro_destaque, pro_destaque_data, pro_nome, pro_likes, pro_views, pro_comentarios_total, pro_autor FROM projeto JOIN utilizador_projeto ON pro_id=utp_proid JOIN utilizador ON utp_utiid=uti_id WHERE pro_activo=1 AND pro_privacidade=1 ORDER BY pro_destaque_data DESC LIMIT 24;
+------+-------------+--------------------+--------+-----------------------------------------------------------------------------------------------+---------------------+---------+---------------------------------+-------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------------------+--------+-----------------------------------------------------------------------------------------------+---------------------+---------+---------------------------------+-------+------------------------------+
| 1 | SIMPLE | projeto | ref | PRIMARY,pro_destaques_index,pro_likes_index,pro_comments_index,pro_views_index,pro_date_index | pro_destaques_index | 2 | const,const | 17865 | Using where; Using temporary |
| 1 | SIMPLE | utilizador_projeto | ref | utp_utiid,utp_proid | utp_proid | 4 | db.projeto.pro_id | 1 | Distinct |
| 1 | SIMPLE | utilizador | eq_ref | PRIMARY | PRIMARY | 4 | db.utilizador_projeto.utp_utiid | 1 | Using index; Distinct |
+------+-------------+--------------------+--------+-----------------------------------------------------------------------------------------------+---------------------+---------+---------------------------------+-------+------------------------------+
此“综合”索引的BEG:
INDEX(pro_active, pro_privacy, -- in either order
pro_highlight_date)
可能检查的行数:139482
将降至检查的行数:24
假设这3列在同一个表中。执行以下操作,而不是使用表名作为列名的前缀:
...
FROM project AS pro
...
WHERE pro.active = 1 ...
这消除了任何歧义(并且需要大约相同的击键次数)
join中的每个字段和何处是索引
太过分了。单列索引通常不如多列(复合)索引有用。见:
此“综合”索引的BEG:
INDEX(pro_active, pro_privacy, -- in either order
pro_highlight_date)
可能检查的行数:139482
将降至检查的行数:24
假设这3列在同一个表中。执行以下操作,而不是使用表名作为列名的前缀:
...
FROM project AS pro
...
WHERE pro.active = 1 ...
这消除了任何歧义(并且需要大约相同的击键次数)
join中的每个字段和何处是索引
太过分了。单列索引通常不如多列(复合)索引有用。请参阅:如果没有关于表索引的信息,如果没有解释计划,则无法说明查询的性能。使用解释计划进行更新。1)如果pro_like在查询中未被引用,它是如何在解释中列出的?2) EXPLAIN中列出的每个表意味着我们需要查看SHOW CREATE table tbl_name的文本结果;对于每个表。3) 请从tbl_名称发布显示索引的文本结果;对于解释中列出的每一个表,我们可以看到索引的每一列的基数。@WilsonHauck感谢您的注意。我更新到原始查询。请让我知道是否可以再改进一点。@NAG在您的问题中我看不到:2)解释中列出的每个表都意味着我们需要查看SHOW CREATE table tbl_name的文本结果;对于每个表。3) 请从tbl_名称发布显示索引的文本结果;对于解释中列出的每个表,我们可以看到索引的每个列的基数。如需更多帮助,请从系统中发布请求的SCTable和SIFrom。免责声明:我是我的个人资料网络个人资料中提到的网站的内容作者。没有关于表索引的信息,也没有解释计划,就无法说明查询的性能。使用解释计划进行更新。1)当发布的查询中未引用pro_like时,它是如何在解释中列出的?2) EXPLAIN中列出的每个表意味着我们需要查看SHOW CREATE table tbl_name的文本结果;对于每个表。3) 请从tbl_名称发布显示索引的文本结果;对于解释中列出的每一个表,我们可以看到索引的每一列的基数。@WilsonHauck感谢您的注意。我更新到原始查询。请让我知道是否可以再改进一点。@NAG在您的问题中我看不到:2)解释中列出的每个表都意味着我们需要查看SHOW CREATE table tbl_name的文本结果;对于每个表。3) 请从tbl_名称发布显示索引的文本结果;对于解释中列出的每个表,我们可以看到索引的每个列的基数。如需更多帮助,请从系统中发布请求的SCTable和SIFrom。免责声明:我是我个人资料《网络简介》中提到的网站的内容作者。我认为索引中的第三列是
pro\u highlight\u date
,而不是pro\u highlight
。可能是打字错误。我认为索引中的第三列是pro\u highlight\u date
,而不是pro\u highlight
。也许是打字错误。。