EDIT:Quy trình lưu trữ MySQL gây ra sự cố?
tôi đã thu hẹp thời gian chờ đợi mysql của tôi xuống đến dòng này:
IF @resultsFound > 0 THEN
INSERT INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Bất cứ ý tưởng tại sao điều này sẽ gây ra một vấn đề? Tôi không thể làm việc được! Xin chào các bạn, tôi đã viết một proc được lưu trữ để tìm kiếm các sản phẩm trong một số danh mục nhất định, do một số ràng buộc nhất định, tôi không thể làm những gì tôi muốn (giới hạn, nhưng vẫn trả về tổng số hàng). được tìm thấy, với phân loại, vv ..)
Điều này có nghĩa là chia nhỏ một chuỗi các Id danh mục, từ 1,2,3 thành bảng tạm thời, sau đó tạo truy vấn tìm kiếm toàn văn dựa trên tùy chọn sắp xếp và giới hạn, thực hiện chuỗi truy vấn và sau đó chọn ra tổng số kết quả.
Bây giờ, tôi biết tôi không có guru MySQL, rất xa nó, tôi đã có nó làm việc, nhưng tôi tiếp tục nhận được thời gian với tìm kiếm sản phẩm vv .. vì vậy tôi nghĩ rằng điều này có thể gây ra một số loại vấn đề?
Có ai có ý tưởng nào về cách tôi có thể dọn dẹp hoặc thậm chí làm theo cách tốt hơn mà tôi có thể không biết?
Cảm ơn ..
DELIMITER $$
DROP PROCEDURE IF EXISTS `product_search` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `product_search`(keywords text, categories text, topLevelCategoryId int, sortOrder int, startOffset int, itemsToReturn int)
BEGIN
declare foundPos tinyint unsigned;
declare tmpTxt text;
declare delimLen tinyint unsigned;
declare element text;
declare resultingNum int unsigned;
drop temporary table if exists categoryIds;
create temporary table categoryIds
(
`CategoryId` int
) engine = memory;
set tmpTxt = categories;
set foundPos = instr(tmpTxt, ',');
while foundPos <> 0 do
set element = substring(tmpTxt, 1, foundPos-1);
set tmpTxt = substring(tmpTxt, foundPos+1);
set resultingNum = cast(trim(element) as unsigned);
insert into categoryIds (`CategoryId`) values (resultingNum);
set foundPos = instr(tmpTxt,',');
end while;
if tmpTxt <> '' then
insert into categoryIds (`CategoryId`) values (tmpTxt);
end if;
CASE
WHEN sortOrder = 0 THEN
SET @sortString = "ProductResult_Relevance DESC";
WHEN sortOrder = 1 THEN
SET @sortString = "ProductResult_Price ASC";
WHEN sortOrder = 2 THEN
SET @sortString = "ProductResult_Price DESC";
WHEN sortOrder = 3 THEN
SET @sortString = "ProductResult_StockStatus ASC";
END CASE;
SET @theSelect = CONCAT(CONCAT("
SELECT SQL_CALC_FOUND_ROWS
supplier.SupplierId as Supplier_SupplierId,
supplier.Name as Supplier_Name,
supplier.ImageName as Supplier_ImageName,
product_result.ProductId as ProductResult_ProductId,
product_result.SupplierId as ProductResult_SupplierId,
product_result.Name as ProductResult_Name,
product_result.Description as ProductResult_Description,
product_result.ThumbnailUrl as ProductResult_ThumbnailUrl,
product_result.Price as ProductResult_Price,
product_result.DeliveryPrice as ProductResult_DeliveryPrice,
product_result.StockStatus as ProductResult_StockStatus,
product_result.TrackUrl as ProductResult_TrackUrl,
product_result.LastUpdated as ProductResult_LastUpdated,
MATCH(product_result.Name) AGAINST(?) AS ProductResult_Relevance
FROM
product_latest_state product_result
JOIN
supplier ON product_result.SupplierId = supplier.SupplierId
JOIN
category_product ON product_result.ProductId = category_product.ProductId
WHERE
MATCH(product_result.Name) AGAINST (?)
AND
category_product.CategoryId IN (select CategoryId from categoryIds)
ORDER BY
", @sortString), "
LIMIT ?, ?;
");
set @keywords = keywords;
set @startOffset = startOffset;
set @itemsToReturn = itemsToReturn;
PREPARE TheSelect FROM @theSelect;
EXECUTE TheSelect USING @keywords, @keywords, @startOffset, @itemsToReturn;
SET @resultsFound = FOUND_ROWS();
SELECT @resultsFound as 'TotalResults';
IF @resultsFound > 0 THEN
INSERT INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
END $$
DELIMITER ;
Bất kỳ sự giúp đỡ rất rất nhiều đánh giá cao!
Có thể nhận được một MÔ TẢ DESCRIBE cho các bảng được sử dụng trong này không? Tôi nghĩ chúng ta có thể làm giảm sự phức tạp và, có thể, cũng tăng tốc độ nếu tôi có thêm đôi mắt nữa. –
Tôi nhận xét kevins thứ hai. quá ít để tiếp tục. – DeveloperChris