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 / 34921
Accepted
ashuthosh
ashuthosh
Asked: 2013-02-19 01:28:49 +0800 CST2013-02-19 01:28:49 +0800 CST 2013-02-19 01:28:49 +0800 CST

Qual é um índice adequado para esta consulta?

  • 772
  1. A consulta abaixo está demorando muito - cerca de 540 segundos.

  2. A tabela não tinha nenhum índice. Criei índices nas colunas da WHEREcláusula e outros campos mas a consulta não está utilizando esses índices.

  3. Sugira bons índices para esta consulta.

Consulta:

select
    alias_to,
    fake_uri,
    concat(ifnull(parameters,''),ifnull(parameters2,''),ifnull(parameters3,'')) as parameters,
    precedence,
    template_name
from site_map_template
order by precedence, fake_uri desc;

Explique a saída:

+----+-------------+-------------------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table             | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------------------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | site_map_template | ALL  | NULL          | NULL | NULL    | NULL | 7616 | Using filesort |
+----+-------------+-------------------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

tabela site_map_template:

CREATE TABLE `site_map_template` (
  `row_mod` datetime DEFAULT NULL,
  `row_create` datetime DEFAULT NULL,
  `template_name` varchar(50) COLLATE latin1_bin DEFAULT NULL,
  `alias_to` varchar(100) COLLATE latin1_bin DEFAULT NULL,
  `package` varchar(50) COLLATE latin1_bin DEFAULT NULL,
  `fake_uri` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `precedence` int(11) DEFAULT NULL,
  `parameters` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `parameters2` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `parameters3` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  KEY `idx_1372` (`template_name`),
  KEY `idx_n1` (`precedence`),
  KEY `idx_n2` (`fake_uri`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin
mysql index-tuning
  • 1 1 respostas
  • 216 Views

1 respostas

  • Voted
  1. Best Answer
    Paul White
    2013-02-19T02:35:10+08:002013-02-19T02:35:10+08:00

    Usando o SQL Server 2012 (espero que haja um equivalente no MySQL):

    CREATE TABLE dbo.site_map_template 
    (
      row_mod datetime NULL,
      row_create datetime NULL,
      template_name varchar(50) COLLATE Latin1_General_BIN2 NULL,
      alias_to varchar(100) COLLATE Latin1_General_BIN2 NULL,
      package varchar(50) COLLATE Latin1_General_BIN2 NULL,
      fake_uri varchar(255) COLLATE Latin1_General_BIN2 NULL,
      precedence integer NULL,
      parameters1 varchar(255) COLLATE Latin1_General_BIN2 NULL,
      parameters2 varchar(255) COLLATE Latin1_General_BIN2 NULL,
      parameters3 varchar(255) COLLATE Latin1_General_BIN2 NULL
    );
    

    Um bom índice clusterizado para esta consulta é:

    CREATE UNIQUE CLUSTERED INDEX PK__site_map_template_precedence_fake_uri
    ON dbo.site_map_template (precedence, fake_uri DESC);
    

    Ou, um índice não clusterizado:

    CREATE NONCLUSTERED INDEX nc1
    ON dbo.site_map_template
        (
        precedence,
        fake_uri DESC
        )
    INCLUDE
        (
        alias_to,
        parameters1,
        parameters2,
        parameters3,
        template_name
        );
    

    A consulta (novamente, na sintaxe do SQL Server) é:

    SELECT
        alias_to, 
        fake_uri,
        [parameters] = CONCAT(parameters1, parameters2, parameters3),
        precedence, 
        template_name 
    FROM dbo.site_map_template
    ORDER BY
        precedence, 
        fake_uri DESC;
    

    E o plano de execução é uma simples varredura do índice:

    Plano de índice clusterizado

    Ou, usando o índice não clusterizado:

    Plano de índice não clusterizado

    O importante em ambos os casos é que cada índice cubra todas as colunas necessárias para a consulta, e as chaves de índice são precedência ASC e fake_uri DESC . Sem a segunda chave descendente, seria necessária uma classificação completa, e esta é provavelmente a causa do seu desempenho lento.

    • 4

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

    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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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