EDIT:¿El procedimiento almacenado de MySQL causa problemas?
He reducido mi mysql de tiempo de espera hasta la siguiente línea:
IF @resultsFound > 0 THEN
INSERT INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Alguna idea de por qué esto podría causar un problema? ¡No puedo resolverlo!
Hola chicos, he escrito un procedimiento almacenado para buscar productos en ciertas categorías, debido a ciertas restricciones que encontré, no pude hacer lo que quería (limitando, pero al mismo tiempo devolviendo el número total de filas encontrado, con clasificación, etc.)
Se divide una cadena de Id. de categoría, de 1,2,3 en una tabla temporal, luego se crea la consulta de búsqueda de texto completo en función de las opciones y los límites de clasificación, ejecuta la cadena de consulta y luego selecciona el número total de resultados.
Ahora, sé que no soy un gurú de MySQL, muy lejos de eso, lo tengo funcionando, pero sigo recibiendo tiempos muertos con búsquedas de productos, etc., así que estoy pensando que esto puede estar causando algún tipo de de problema?
¿Alguien tiene alguna idea de cómo puedo arreglar esto, o incluso hacerlo de una manera mucho mejor que probablemente no conozca?
Gracias ..
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 ;
cualquier ayuda es muy muy apreciados!
¿Sería posible obtener una TABLA DESCRIBE para las tablas utilizadas en esto? Creo que podemos reducir la complicación y, posiblemente, acelerarla también si tuviera más ojos en las mesas. –
I segundo comentario kevins. muy poco para seguir. – DeveloperChris