2012-06-09 28 views
5

Vì vậy, đây là một bảng rất đơn giản 'tbl':Tại sao truy vấn MySQL đơn giản này lại quá chậm?

+---------+---------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+---------------------+------+-----+---------+----------------+ 
| val  | varchar(45)   | YES | MUL | NULL |    | 
| id  | bigint(20) unsigned | NO | PRI | NULL | auto_increment | 
+---------+---------------------+------+-----+---------+----------------+ 

Và chỉ số cho nó:

+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| tbl |   0 | PRIMARY |   1 | id   | A   | 201826018 |  NULL | NULL |  | BTREE  |   | 
| tbl |   1 | val  |   1 | val   | A   |  881336 |  NULL | NULL | YES | BTREE  |   | 
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 

Tôi đang cố gắng này đơn giản chọn:

select val from tbl where val = 'iii'; 

kết quả: 86.208 các hàng trong tập hợp (0,08 giây)

Nhưng khi tôi muốn sửa đổi một chút:

select id, val from tbl where val = 'iii'; 

kết quả là: 86.208 hàng trong set (47,30 giây)

tôi có quyền chỉ số trên coumn rằng nơi điểm đến, tất cả Tôi đang thay đổi là các hàng kết quả đại diện. Tại sao có sự chậm trễ đáng sợ như vậy? (Tôi phải nói rằng tôi không thể tái tạo sự chậm trễ này mỗi khi tôi muốn: ngay cả sau khi 'đặt lại bộ nhớ cache truy vấn' hoặc thiết lập 'query_cache_type = off' lệnh nó có thể được thực hiện một cách nhanh chóng).

+2

Bạn có thể thử chạy 'EXPLAIN' nhưng nghi ngờ rằng đây là vấn đề liên quan đến máy chủ. –

+0

Tại sao bạn chọn 86 nghìn trường và làm điều đó trong hai cột? Tôi nghĩ rằng vấn đề ở đây là logic của truy vấn:/Có lẽ bạn nên chia sẻ những gì bạn đang đạt được? –

+0

Động cơ ?, hãy thử chỉ mục văn bản đầy đủ – jcho360

Trả lời

3

Nếu không thực sự kiểm tra cấu hình máy chủ của bạn, thật khó để nói, nhưng đây là phỏng đoán được giáo dục. Trong trường hợp đầu tiên, MySQL có thể đáp ứng truy vấn của bạn mà không thực sự đọc dữ liệu bảng. Tất cả thông tin bạn đã yêu cầu có thể được lấy từ chỉ mục một mình. Lưu ý rằng chỉ số của chỉ số val chỉ theo thứ tự của các hàng 10 và các hàng sẽ rất ngắn trong chỉ mục.

Trong trường hợp thứ hai, bạn đã yêu cầu dữ liệu KHÔNG có trong chỉ mục trên val. Bây giờ động cơ đã thực sự tìm và đọc các hàng từ dữ liệu. Ở đây cardinality lớn hơn khoảng 250 lần, và vì chỉ mục sẽ lấy các hàng được đặt hàng bởi val, việc tìm kiếm các giá trị id tương ứng sẽ đòi hỏi rất nhiều nhảy xung quanh trong vài trăm hợp đồng dữ liệu trên đĩa. Điều này sẽ chậm hơn rất nhiều.

+0

đây là lý do. – Sebas

+0

Có, chỉ số tuple thích hợp đã làm điều này. Cảm ơn bạn và vui lòng truy cập câu hỏi mới của tôi: http://stackoverflow.com/questions/11004651/how-to-make-well-indexed-mysql-tables-join-effectively :) –

0

Hãy thử thêm ORDER BY và `LIMIT vào truy vấn. Điều đó sẽ giúp ích rất nhiều.

Tôi nghĩ rằng nếu bạn thay đổi truy vấn để này nó sẽ nhanh hơn:

select id, val from tbl where val = 'iii' order by val limit 10; 
+0

"giới hạn" sẽ chỉ giới hạn số hàng được khôi phục ... nó nhanh hơn, nhưng nếu bạn cần toàn bộ dữ liệu, nó vô ích. mặt khác, "thứ tự bằng" sẽ làm chậm truy vấn, vì máy chủ phải sắp xếp bộ kết quả trước khi gửi dữ liệu – Barranka

+0

Đặt hàng bằng cách làm chậm truy vấn – jcho360

+0

@Barranka: giả sử anh ta đã chọn tất cả các hàng, vâng. Nếu không, anh ta đã chọn một vài hàng ngẫu nhiên và cơ sở dữ liệu không biết cách tối ưu hóa điều đó. – Wolph

0

Bạn đang làm một chọn dựa trên hai cột, nhưng không có chỉ mục của cả hai tồn tại. Thử thêm chỉ mục mới bao gồm cả hai số id và val.

+1

tại sao anh ta cần một chỉ mục trên id khi anh ta chỉ tìm kiếm trên val? – gbjbaanb

Các vấn đề liên quan