Почему множественные соединения занимают слишком много строк в mysql?
Я написал много хранимых процедур в этой базе данных, и почти все запросы, содержащие более 2 соединений, выполняются очень медленно и занимают 15-20 секунд.
Обратите внимание, что я не могу редактировать схему.
Я делюсь здесь одной из этих процедур, как показано ниже,
помогите выяснить ошибку, если таковая имеется, или предложите метод преодоления этой проблемы.
Что я уже пробовал:
<pre>-- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stored by the server -- -------------------------------------------------------------------------------- DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `Proc_BarcodeScanDetail`(IN scancode TEXT) BEGIN IF ((select Barcode from location_barcode where Barcode = scancode limit 1) = scancode) THEN SELECT distinct hg.SKU_code,SKU_NAME,COMPRESSION_FACTOR,REF_BATCH_CODE,EXPIRY_DATETIME, hg.MRP,SOH/COMPRESSION_FACTOR as 'SOH',BARCODE FROM Master sm inner join stock_master hg ON sm.code = hg.code inner join location_barcode lb on hg.SKU_LOC_STOCK_NO = lb.sku_Loc_Stock_No WHERE lb.Barcode = scancode and SOH/COMPRESSION_FACTOR >0 limit 1; ELSEIF ((select EAN_code from ean_sku_link where EAN_code = scancode limit 1)= scancode) THEN SELECT hg.SKU_code,SKU_NAME,COMPRESSION_FACTOR,REF_BATCH_CODE,EXPIRY_DATETIME, hg.MRP,SOH/COMPRESSION_FACTOR as 'SOH',EAN_code FROM Master sm inner join stock_master hg ON sm.code = hg.code inner join ean_sku ean on hg.SKU_CODE = ean.SKU_CODE WHERE ean.EAN_code = scancode and SOH/COMPRESSION_FACTOR >0 limit 1; end if; END
В этой процедуре подзапросы в операторах IF и ELSE обнаруживают, что сканированный штрих-код является глобальным(сгенерированным компанией) или локальным(сгенерированным лично). Кроме того, если отсканированный штрих-код является локальным, то выполняется 1-й основной запрос, а если отсканированный штрих-код является глобальным, то выполняется 2-й основной запрос. Я использовал внутреннее объединение "мастер" , "stock_master" ,"location_barcode"/"ean_sku".
Это занимает 5-8 секунд для выполнения подзапросов и 10-12 секунд для основных запросов, следовательно, 15-20 секунд для всей процедуры.
количество строк table_name
location_barcode 378150
мастер 76573
stock_master 280001
ean_sku 18233
ZurdoDev
Убедитесь, что у вас есть правильные индексы.
j snooze
Согласитесь с Ряндевым: если ваша база данных построена плохо и практически не имеет индексов, вы мало что можете сделать со своим кодом, чтобы ускорить работу, и она будет только ухудшаться по мере роста базы данных. Однако если вы присоединяетесь к неиндексным полям или используете предложения where для неиндексированных полей, то на вас лежит ответственность за написание лучшего SQL. В любом месте, где вы можете заставить SQL использовать индекс путем объединения или фильтрации, сделайте это.
Member 11543226
Я проверил и добавил индексированное поле в предложение where, теперь это решило мою проблему.
Member 11543226
Спасибо