AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 344778
Accepted
adrianTNT
adrianTNT
Asked: 2025-01-17 23:42:36 +0800 CST2025-01-17 23:42:36 +0800 CST 2025-01-17 23:42:36 +0800 CST

Como acelerar essa consulta com múltiplos índices?

  • 772

Como posso acelerar esta consulta abaixo? Tenho uma tabela ~grande com url_meta90 milhões de registros, 38 GB de dados, 6 GB de índice

O ID exclusivo principal de cada linha é url_hash(um md5 truncado para 16 caracteres)

Então criei um grande índice de texto completo chamado url_meta_index, contendo estas colunas:

  • título_url
  • url_descrição
  • palavras-chave url
  • url_paragrafos

A tabela também contém uma coluna indexada chamadaurl_total_links_in

  1. Se eu selecionar apenas as URLs com muitos links, o processo será muito rápido e, o mais importante, há apenas 240 linhas com mais de 1.000 links:
SELECT * FROM url_meta WHERE url_total_links_in > 1000
240 rows in set (0.01 sec)
  1. Mas se eu pesquisar no índice de texto grande DEPOIS da mesma consulta (selecionando as mesmas linhas acima) , isso demora uma eternidade:

     mysql> 
     SELECT  *
     FROM  url_meta
     WHERE  url_total_links_in > 1000
       AND  match(url_title, url_description, url_keywords, url_paragraphs)
         against('computer store' IN BOOLEAN MODE)
     LIMIT  500;
    
     10 rows in set (4 min 4.94 sec)
    

Eu esperava match againstque a segunda parte olhasse apenas os 240 registros que encontrou por url_total_links_in > 1000, não é assim que funciona ? Pelo longo tempo de consulta, acho que ele olha todos os 90 milhões de registros.

Por PHP, posso selecionar as 240 linhas na primeira consulta e, em seguida, fazer um loop sobre essas poucas linhas para "comparar" com o texto mostrado na segunda consulta. Mas como posso fazer isso pelo MySQL?

Ajudaria se eu ... incluísse o id de linha exclusivo ( url_hash) no índice de texto multicoluna grande url_meta_index? Ou ajuda se eu adicionar a coluna url_total_links_inao mesmo índice de texto multicoluna url_meta_index? Algum outro operador MySQL que ajudaria neste caso? Ou alguma variável MySQL que seria relevante neste caso?

Edição posterior, incluindo mais detalhes:

DESCRIBE url_meta;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| url_hash           | char(16)     | NO   | PRI | NULL    |       |
| url_sharding       | char(2)      | YES  | MUL | NULL    |       |
| url                | varchar(512) | NO   |     | NULL    |       |
| url_title          | varchar(128) | YES  | MUL | NULL    |       |
| url_description    | text         | YES  |     | NULL    |       |
| url_keywords       | varchar(128) | YES  |     | NULL    |       |
| url_paragraphs     | mediumtext   | YES  |     | NULL    |       |
| url_total_links_in | smallint     | NO   | MUL | 0       |       |
| url_meta_date      | int          | NO   |     | 0       |       |
| url_misc           | tinyint      | YES  |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+
EXPLAIN ANALYZE SELECT * FROM url_meta WHERE url_total_links_in > 1000 AND match(url_title, url_description, url_keywords, url_paragraphs) against('computer store' IN BOOLEAN MODE) LIMIT 500;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Limit: 500 row(s)  (cost=0.40 rows=0.05) (actual time=2582.991..21198.806 rows=10 loops=1)
    -> Filter: ((url_meta.url_total_links_in > 1000) and (match url_meta.url_title,url_meta.url_description,url_meta.url_keywords,url_meta.url_paragraphs against ('computer store' in boolean mode)))  (cost=0.40 rows=0.05) (actual time=2582.991..21198.800 rows=10 loops=1)
        -> Full-text index search on url_meta using url_meta_index (url_title='computer store')  (cost=0.40 rows=1) (actual time=312.284..21096.609 rows=1247864 loops=1)
 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (23.36 sec)
SHOW INDEX FROM url_meta;
+----------+------------+--------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table    | Non_unique | Key_name           | Seq_in_index | Column_name        | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+----------+------------+--------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| url_meta |          0 | PRIMARY            |            1 | url_hash           | A         |    81358144 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| url_meta |          1 | url_total_links_in |            1 | url_total_links_in | A         |        2790 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| url_meta |          1 | url_sharding       |            1 | url_sharding       | A         |        1590 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
| url_meta |          1 | url_meta_index     |            1 | url_title          | NULL      |    81358147 |     NULL |   NULL | YES  | FULLTEXT   |         |               | YES     | NULL       |
| url_meta |          1 | url_meta_index     |            2 | url_description    | NULL      |    81358147 |     NULL |   NULL | YES  | FULLTEXT   |         |               | YES     | NULL       |
| url_meta |          1 | url_meta_index     |            3 | url_keywords       | NULL      |    81358147 |     NULL |   NULL | YES  | FULLTEXT   |         |               | YES     | NULL       |
| url_meta |          1 | url_meta_index     |            4 | url_paragraphs     | NULL      |    81358147 |     NULL |   NULL | YES  | FULLTEXT   |         |               | YES     | NULL       |
+----------+------------+--------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
7 rows in set (0.00 sec)
mysql
  • 1 1 respostas
  • 45 Views

1 respostas

  • Voted
  1. Best Answer
    Rick James
    2025-01-19T07:33:40+08:002025-01-19T07:33:40+08:00

    A única maneira que o MySQL pode fazer MATCHé fazê-lo primeiro . Isso levou a 1.247.864 linhas. O resto WHEREreduziu para muito poucas linhas.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve