Các chỉ số tạo ra sự khác biệt lớn trong mysql, một truy vấn mất 15 phút với một tập hợp chỉ số sai mất 0,2 giây với những chỉ số phù hợp, nhưng việc tìm ra số dư phù hợp thường là vấn đề. Đương nhiên, nếu không có một số dữ liệu mẫu thì thật khó để nói liệu giải pháp dưới đây có giúp bạn tiết kiệm thời gian hay không, nhưng về lý thuyết thì đúng như vậy.
Để trả lời câu hỏi của bạn, tôi sẽ thiết kế lại các bảng như sau:
CREATE TABLE `product_all` (
`prod_id` INT( 10 ) NOT NULL,
`ref_id` INT( 10) NOT NULL,
`date` DATE NOT NULL ,
`buy_link` BLOB NOT NULL ,
`sale_price` FLOAT NOT NULL,
PRIMARY KEY (prod_id, ref_id) ,
INDEX date_Index (`date` ASC),
UNIQUE INDEX prod_price_Index (prod_id ASC, sale_price ASC)
) ENGINE = MYISAM ;
CREATE TABLE `product_info` (
`prod_id` INT( 10 ) NOT NULL AUTO_INCREMENT,
`prod_name` VARCHAR( 200 ) NOT NULL,
`brand` VARCHAR( 50 ) NOT NULL,
`retail_price` FLOAT NOT NULL,
`category` INT( 3 ) NOT NULL,
`gender` VARCHAR( 1 ) NOT NULL,
`type` VARCHAR( 10 ) NOT NULL,
PRIMARY KEY (prod_id) ,
UNIQUE INDEX prod_id_name_Index (prod_id ASC, prod_name ASC),
INDEX category_Index (category ASC),
INDEX gender_Index (gender ASC)
) ENGINE = MYISAM ;
SELECT product_info.*, MIN(product_all.sale_price) as sale_price, product_all.buy_link
FROM product_info
NATURAL JOIN (SELECT * FROM product_all WHERE product_all.date = '2010-09-30') as product_all
WHERE (product_info.category = 2
AND product_info.gender = 'W' )
GROUP BY product_all.prod_id
ORDER BY MIN(product_all.sale_price) ASC LIMIT 13
Hiệu suất đạt được ở đây là tôi đã lập chỉ mục các trường chính đang được tham gia và được làm nổi bật trong mệnh đề where. Cá nhân tôi sẽ đi với truy vấn đầu tiên của bạn khi bạn nghĩ về nó sẽ hoạt động tốt hơn.
Theo như tôi hiểu điều gì đang xảy ra trong truy vấn thứ nhất và thứ hai:
- Truy vấn đầu tiên đang được lọc bởi một truy vấn phụ trước khi thực hiện phép nối tự nhiên, điều đó có nghĩa là nó chỉ tiếp giáp với dữ liệu kết quả chứ không phải toàn bộ bảng.
- Truy vấn thứ hai là kết hợp bảng thứ hai của dòng và sau đó lọc các hàng kết quả của lô lỗ hổng trở lại những gì bạn muốn.
Theo quy tắc thông thường, bạn muốn thêm chỉ số vào các trường nối chính của mình và cả các trường mà bạn sử dụng nhiều nhất trong mệnh đề where. Tôi cũng đã đặt một số chỉ số duy nhất trên một số trường mà bạn sẽ muốn truy vấn thường xuyên, chẳng hạn như prod_id_name_Index.
Nếu điều này không cải thiện hiệu suất của bạn, nếu bạn có thể đăng một số dữ liệu giả để chơi với tôi, tôi có thể có được giải pháp nhanh hơn mà tôi có thể làm điểm chuẩn.
Tại đây là một bài viết về lập chỉ mục cho hiệu suất trong mysql, đáng để đọc nếu bạn muốn biết thêm.
Chúc các bạn thành công!
CHỈNH SỬA:Câu hỏi cuối cùng của bạn, tôi đã bỏ lỡ lần đầu tiên, câu trả lời là nếu bạn lập chỉ mục các trường kết hợp chính sau đó thay đổi thành phần lớn những thứ bạn sẽ muốn làm cơ sở cho các truy vấn. Điều chính cần nhớ là nếu bạn truy vấn hoặc tham gia vào một trường thường xuyên thì trường đó sẽ thực sự được lập chỉ mục, nhưng những truy vấn nhỏ và thay đổi thứ tự do bạn thực hiện thì bạn không nên lo lắng về việc sắp xếp lại chiến lược lập chỉ mục của mình.