Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chỉ mục Mysql trên chế độ xem không hoạt động

Bạn không thể tạo chỉ mục trên một chế độ xem: http:/ /dev.mysql.com/doc/refman/5.7/en/view-restrictions.html , vì vậy bạn phải hy vọng chỉ mục được sử dụng. https://stackoverflow.com/a/7922711/3595565

Giải pháp thay thế

Có một cách giải quyết được đề cập trong các nhận xét của phần khác của tài liệu: https://dev.mysql.com/doc/refman/5.5/en/create-view.html Trong đó bạn tạo một bảng thông thường và đặt chỉ mục chuyên biệt của mình và tải dữ liệu từ dạng xem vào bảng.

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

Tại sao Truy vấn của bạn không sử dụng các chỉ mục?

Khi sử dụng UNION trong một SELECT mysql tạo một bảng tạm thời để lưu dữ liệu. Do đó, dạng xem là 'lối tắt' cho truy vấn phức tạp hơn của bạn, khi gọi lệnh chọn, nó sẽ lại thực thi liên hợp, sử dụng bảng tạm thời ... sử dụng thuật số tạm thời để xử lý dữ liệu.

Kiểm tra lại hướng dẫn sử dụng: http://dev.mysql. com / doc / refman / 5.7 / en / view-domains.html

Kết luận :UNION trong truy vấn của bạn cản trở chế độ xem sử dụng các chỉ mục.

Nguồn

câu hỏi trong diễn đàn mysql cho cùng một vấn đề câu trả lời:

báo cáo lỗi "KHÔNG TẠO BẢNG TẠM THỜI CHO TẤT CẢ UNION"

Đã sửa lỗi trong MySQL 5.7 http:/ /dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html

Một số dữ liệu thử nghiệm để kiểm tra trình biên dịch

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;

Kiểm tra hồ sơ:

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

Tôi không thể lấy quá nhiều thông tin ra khỏi hồ sơ, nhưng nó đề cập đến bảng tạm thời, đủ (đối với tôi) để xác thực kết luận của tôi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CHỌN SQL một-nhiều thành một hàng

  2. Cách khắc phục Mã trạng thái máy chủ:302 Tìm thấy bởi SQL Inject Me Firefox Addon

  3. MySQL:Cột tạm thời tăng tự động trong câu lệnh chọn

  4. Tập lệnh CREATE được xuất bởi MySQL Workbench có lỗi cú pháp trên máy tính khác

  5. CẬP NHẬT KHÓA DUPLICATE với điều kiện WHERE