Подозирам, че бавността е в извличането на редовете, броя на върнатите редове, а не в 5000+ контейнера за свързване в оператора. pId IN ( ? , ? , ... , ? )
Моето предложение би било да тествате връщането само на един ред, да предоставите една стойност, за която е известно, че съществува/да върнете ред, и след това 4999+ стойности, за които е известно, че не съществуват/не връщат ред.
Например, ако знаем най-високата стойност на pId в таблицата, използваме стойности, по-високи от тази, предоставяме стойности на свързване за израз като този
... pId IN ( ? , ? , ? , ... , ? )
така че резултатът ще бъде еквивалентен на стартиране
... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )
което би било същият резултат, който бихме получили при стартиране
... pId IN ( 42 )
Нашето очакване би било да върнем само един ред ( pId =42 ).
След това сравнете времето на това (5000+ стойности на свързване, връщащи 1 ред) с две стойности на свързване, връщащи един ред
... pId IN ( 99999999 , 42 )
И вижте дали има значителна разлика в производителността.
(Има още работа за вършене с 5000+ стойности на свързване, но не бих очаквал огромен разлика, но трябва да се тества.
Като помислим малко, може да е по-лесно да настроите тест, като използвате всички съществуващи стойности на свързване и просто добавите LIMIT 2
до края на заявката. (Не съм сигурен дали MySQL има някои подобрения в производителността за LIMIT 2
.
Може би е по-добре да добавите условие като AND pId * 10 = 420
Целта е да предоставите цял набор от стойности на свързване, но да върнете само един или два реда.
Друг тест би бил да върнете цял набор от редове, но използвайки само няколко стойности на свързване. Може би условие за диапазон, което връща 5000+ реда.
Заявката може да бъде:
... pId >= ? AND pId <= ?
с достатъчно голям диапазон между предоставените стойности, които получаваме в близост до 5000 реда.
И сравнете ефективността.
Моята прогноза (предполагам?) е, че производителността ще бъде свързана повече с броя на върнатите редове, отколкото с броя на стойностите на свързване.
Не съм сигурен дали това е отговор на въпроса ви, но това е подходът, който бих предприел, за да отговоря на въпроса ... "какво причинява това да е бавно, броят на стойностите на свързване или броят върнати редове? "