sql >> Database >  >> RDS >> Mysql

Mysql-index in weergave werkt niet

U kunt geen index maken voor een weergave:http:/ /dev.mysql.com/doc/refman/5.7/en/view-restrictions.html , dus je moet hopen dat de index wordt gebruikt. https://stackoverflow.com/a/7922711/3595565

Oplossing

Er is een tijdelijke oplossing genoemd in de opmerkingen van een ander deel van de documentatie:https://dev.mysql.com/doc/refman/5.5/en/create-view.html Waarin u een gewone tabel maakt en uw gespecialiseerde index instelt en de gegevens uit de weergave in de tabel laadt.

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

Waarom maakt uw zoekopdracht geen gebruik van de indexen?

Bij gebruik van UNION in een SELECT mysql maakt een tijdelijke tabel om de gegevens op te slaan. Dus aangezien een view een 'snelkoppeling' is voor je meer complexe query, zal het bij het aanroepen van de select opnieuw de unie uitvoeren, een tijdelijke tabel gebruiken... gebruik het verleidelijke algoritme om de gegevens te verwerken.

De handleiding opnieuw bekijken:http://dev.mysql. com/doc/refman/5.7/en/view-restrictions.html

Conclusie :De UNION in uw zoekopdracht verhindert de weergave van het gebruik van de indexen.

Bronnen

vraag in mysql-forum over hetzelfde probleem antwoord:

bugrapport "MAAK GEEN TIJDELIJKE TABELLEN VOOR ALLE UNION"

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

Enkele testgegevens om de profiler te controleren

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;

Controleer de profiler:

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 |
+--------------------------------+----------+

Ik kan niet te veel informatie uit het profiel halen, maar het vermeldt wel een tijdelijke tabel, genoeg (voor mij) om mijn conclusie te valideren.




  1. Oracle Database 12c-software installeren op Windows

  2. PHP-SQL:Geüploade afbeelding weergegeven als ongewenste tekst

  3. Waarom komt de varchar-sorteervolgorde van Oracle niet overeen met het gedrag van varchar-vergelijking?

  4. Hoe SUBDATE() werkt in MariaDB