sql >> Databáze >  >> RDS >> Mysql

Mysql index na zobrazení nefunguje

Nemůžete vytvořit index pro zobrazení:http:/ /dev.mysql.com/doc/refman/5.7/en/view-restrictions.html , takže musíte doufat, že se použije index. https://stackoverflow.com/a/7922711/3595565

Řešení

V komentářích k jiné části dokumentace je zmíněno řešení:https://dev.mysql.com/doc/refman/5.5/en/create-view.html Ve kterém vytvoříte běžnou tabulku a nastavíte svůj specializovaný index a načtete data z pohledu do tabulky.

LOCK TABLES materializedView WRITE; 
TRUNCATE materializedView; 
INSERT INTO materializedView SELECT * FROM regularView;
UNLOCK TABLES;

Proč váš dotaz nevyužívá indexy?

Při použití UNION v SELECT mysql vytvoří dočasnou tabulku pro uložení dat. Vzhledem k tomu, že pohled je 'zkratkou' pro váš složitější dotaz, při volání selectu opět provede sjednocení, použije dočasnou tabulku... pro zpracování dat použijte temptable algoritmus.

Znovu zkontrolujte příručku:http://dev.mysql. com/doc/refman/5.7/en/view-restrictions.html

Závěr :UNION ve vašem dotazu brání zobrazení v používání indexů.

Zdroje

otázka na fóru mysql pro stejný problém odpověď:

hlášení o chybách „NEVYTVOŘUJTE DOČASNÉ TABULKY PRO VŠECHNY UNION“

Opraveno v MySQL 5.7 http:/ /dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html

Některá testovací data pro kontrolu profilovače

CREATE TABLE test1 (
    id int auto_increment PRIMARY KEY,
  col1 varchar(50),
  col2 varchar(50)
);

CREATE TABLE test2 (
    id int auto_increment PRIMARY KEY,
  col1 varchar(50),
  col2 varchar(50)
);

INSERT INTO test1 (col1, col2) 
VALUES 
('test', 'testcol2'),
('test', 'testcol2'),
('test', 'testcol2'),
('test', 'testcol2'),
('test', 'testcol2'),
('test', 'testcol2');


INSERT INTO test2 (col1, col2) 
VALUES 
('test2', 'testcol2'),
('test2', 'testcol2'),
('test2', 'testcol2'),
('test2', 'testcol2'),
('test2', 'testcol2'),
('test2', 'testcol2');

CREATE VIEW testview AS
SELECT * FROM test1
UNION
SELECT * FROM test2;

Zkontrolujte profilovač:

SET PROFILING = 1;
SELECT * FROM testview WHERE id = 1;
+----+-------+----------+
| id | col1  | col2     |
+----+-------+----------+
|  1 | test  | testcol2 |
|  1 | test2 | testcol2 |
+----+-------+----------+
SHOW PROFILE;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000017 |
| Waiting for query cache lock   | 0.000004 |
| checking query cache for query | 0.000029 |
| checking permissions           | 0.000006 |
| Opening tables                 | 0.000121 |
| System lock                    | 0.000012 |
| checking permissions           | 0.000014 |
| checking permissions           | 0.000032 |
| optimizing                     | 0.000004 |
| statistics                     | 0.000007 |
| preparing                      | 0.000006 |
| executing                      | 0.000003 |
| Sending data                   | 0.000046 |
| optimizing                     | 0.000003 |
| statistics                     | 0.000004 |
| preparing                      | 0.000003 |
| executing                      | 0.000002 |
| Sending data                   | 0.000023 |
| optimizing                     | 0.000003 |
| statistics                     | 0.000003 |
| preparing                      | 0.000003 |
| executing                      | 0.000002 |
| Sending data                   | 0.000008 |
| removing tmp table             | 0.000005 |
| Sending data                   | 0.000005 |
| Waiting for query cache lock   | 0.000002 |
| Sending data                   | 0.000024 |
| init                           | 0.000011 |
| optimizing                     | 0.000006 |
| statistics                     | 0.000004 |
| preparing                      | 0.000006 |
| executing                      | 0.000002 |
| Sending data                   | 0.000021 |
| end                            | 0.000003 |
| query end                      | 0.000004 |
| closing tables                 | 0.000002 |
| removing tmp table             | 0.000004 |
| closing tables                 | 0.000006 |
| freeing items                  | 0.000005 |
| Waiting for query cache lock   | 0.000003 |
| freeing items                  | 0.000013 |
| Waiting for query cache lock   | 0.000002 |
| freeing items                  | 0.000002 |
| storing result in query cache  | 0.000003 |
| logging slow query             | 0.000002 |
| cleaning up                    | 0.000003 |
+--------------------------------+----------+

Nemohu z profilu vytáhnout příliš mnoho informací, ale zmiňuje dočasnou tabulku, což je dost (pro mě) na potvrzení mého závěru.




  1. Django bulk_create s ignorováním řádků, které způsobují chybu IntegrityError?

  2. Připojení RazorSQL k Salesforce.com

  3. Chyba připojení Android java.lang.UnsupportedOperationException

  4. PDO:Připojení k databázi na vzdáleném webu