Podejrzewam, że powolność polega na pobieraniu wierszy, liczbie zwracanych wierszy, a nie na ponad 5000 symboli zastępczych powiązania w instrukcji. pId IN ( ? , ? , ... , ? )
Proponuję przetestować zwracanie tylko jednego wiersza, podać jedną wartość, o której wiadomo, że istnieje/zwraca wiersz, a następnie ponad 4999 wartości, o których wiadomo, że nie istnieją/nie zwracają wiersza.
Na przykład, jeśli znamy najwyższą wartość pId w tabeli, użyj wartości wyższych niż ta, podaj wartości wiązania dla instrukcji takiej jak ta
... pId IN ( ? , ? , ? , ... , ? )
więc wynik byłby równoznaczny z uruchomieniem
... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )
co byłoby tym samym wynikiem, który byśmy uruchomili
... pId IN ( 42 )
Naszym oczekiwaniem byłoby zwrócenie tylko jednego wiersza ( pId =42 ).
Następnie porównaj czas tego (ponad 5000 wartości wiązania zwraca 1 wiersz) z dwoma wartościami wiązania zwracającymi jeden wiersz
... pId IN ( 99999999 , 42 )
I zobacz, czy istnieje znacząca różnica w wydajności.
(Jest więcej pracy do zrobienia z ponad 5000 wartościami wiązania, ale nie spodziewałbym się ogromnego różnica, ale należy to przetestować.
Zastanawiając się trochę, łatwiej byłoby skonfigurować test przy użyciu wszystkich istniejących wartości wiązania i po prostu dodać LIMIT 2
do końca zapytania. (Nie jestem pewien, czy MySQL ma jakieś ulepszenia wydajności dla LIMIT 2
.
Może lepiej dodać warunek taki jak AND pId * 10 = 420
Celem jest dostarczenie całej masy wartości wiązania, ale zwrócenie tylko jednego lub dwóch wierszy.
Innym testem byłoby zwrócenie całej masy wierszy, ale przy użyciu tylko kilku wartości wiązania. Może warunek zakresu, który zwraca ponad 5000 wierszy.
Zapytanie może brzmieć:
... pId >= ? AND pId <= ?
z wystarczająco dużym zakresem między podanymi wartościami, które otrzymujemy w okolicach 5000 wierszy.
I porównaj wydajność.
Moje przewidywanie (zgaduję?) jest takie, że wydajność będzie bardziej skorelowana z liczbą zwróconych wierszy niż z liczbą wartości wiązania.
Nie jestem pewien, czy to jest odpowiedź na twoje pytanie, ale jest to podejście, które podjąłbym, aby odpowiedzieć na pytanie ... „co powoduje, że to jest powolne, liczba wartości wiązania lub liczba zwróconych wierszy? "