EDIT:Procedura przechowywana MySQL powodująca problemy?
mam zawężony mój mysql limit czasu oczekiwania na dół do tej linii:
IF @resultsFound > 0 THEN
INSERT INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Każdy pomysł, dlaczego miałoby to powodować problem? Nie mogę tego rozpracować!
Witajcie, napisałem przechowywany proc, aby wyszukać produkty w pewnych kategoriach, z powodu pewnych ograniczeń, z jakimi się zetknąłem, nie mogłem zrobić tego, co chciałem (ograniczając, ale wciąż zwracając całkowitą liczbę wierszy znalezione, z sortowaniem itp.)
Oznacza to, że dzieli ciąg identyfikatorów kategorii, od 1,2,3 do tabeli tymczasowej, a następnie tworzy zapytanie wyszukiwania pełnotekstowego w oparciu o opcje sortowania i ograniczenia, wykonuje ciąg zapytania, a następnie wybiera całkowitą liczbę wyników.
Wiem, że nie jestem guru MySQL, bardzo daleko od tego, mam to działa, ale mam coraz więcej czasu na szukanie produktu itp .. więc myślę, że to może być przyczyną pewnego rodzaju problemu?
Czy ktoś ma jakieś pomysły, jak mogę to posprzątać, czy nawet zrobić to o wiele lepiej, o czym prawdopodobnie nie wiem?
Dzięki ..
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 ;
Każda pomoc jest bardzo bardzo cenione!
Czy można uzyskać DESIGNIBE TABLE dla tabel używanych w tym? Myślę, że możemy zmniejszyć komplikacje i ewentualnie przyspieszyć to, gdybym miał więcej oczu na własnych stołach. –
I drugi komentarz kevins. za mało, aby kontynuować. – DeveloperChris