programing

"in 절" 내의 MySQL 항목 수

kingscode 2022. 10. 8. 16:54
반응형

"in 절" 내의 MySQL 항목 수

사용자를 정의하는 테이블은 3개입니다.

USER: user_id (int), username (varchar)
USER_METADATA_FIELD: user_metadata_field_id (int), field_name (varchar)
USER_METADATA: user_metadata_field_id (int), user_id (int), field_value (varchar)

애플리케이션 내의 다른 사용자에게 특정 액세스 권한을 가진 중간 계층 사용자를 만들고 싶습니다.로그인한 사용자가 액세스할 수 있는 사용자를 결정하기 위해 다음과 같은 하위 쿼리를 사용합니다.

SELECT user_id FROM user WHERE user_id 
     IN (SELECT user_id 
         FROM user_metadata 
         WHERE user_metadata_field_id = 1 AND field_value = 'foo')

현재 서브쿼리 문자열을 변수에 저장한 후 사용자 목록을 꺼낼 때마다 외부 쿼리에 동적으로 삽입하고 있습니다.이걸 하고 나서 나는 생각했다. "그냥 실물을 저장해 두는 게 낫겠다.user_ids" 입니다.

변수에 저장하는 대신...

$subSql = "SELECT user_id FROM user_metadata WHERE user_metadata_field_id = 1 AND field_value = 'foo'";

...실제로 쿼리를 실행하고 결과를 이렇게 저장합니다.

$subSql = "12, 56, 89, 100, 1234, 890";

로그인한 사용자가 액세스할 수 있는 사용자를 불러와야 할 경우 다음 작업을 수행할 수 있습니다.

$sql = "SELECT user_id FROM user WHERE user_id IN ($subSql)";

그리고 마지막으로 다음과 같은 질문을 합니다.

MySQL에서 사용할 수 있는 항목 수IN조항? sub-sql 문 대신 실제 ID를 저장하는 것이 매번 외부 쿼리를 수행하는 데 더 빠를 수 있습니다.

매뉴얼:

의 값 수INlist는 값에 의해서만 제한됩니다.

특정 번호부터 시작해서IN테이블이 더 빠릅니다.

MySQL에는 코드 내에 다수의 상수 값 범위 구축이 중첩된 루프에서 동일한 범위를 구축하는 것보다 느려지는 무언가가 있습니다.

퍼포먼스에 대한 자세한 내용은 블로그에서 다음 기사를 참조하십시오.

Quassnoi의 답변에서 알 수 있듯이 MySql 버전 구현(*)에 의해 부과될 있는 제한에 도달하기 전에 다른 실용적인 고려사항을 더듬는다.따라서 관리 사용자(또는 IN 구성을 필요로 하는 기타 기준)의 수가 증가함에 따라 임시(또는 영구) 테이블의 사용 등 문자 그대로의 "IN"을 대체하는 방법을 모색해야 합니다.

"admin user" 기준을 특별 취급하고 싶다고 생각하고 있기 때문에, 퍼포먼스를 위해서 코멘트나 제안을 드리고 싶습니다.

코멘트: 너무 이른 최적화의 경우일 수 있습니까?
이 데이터베이스의 구체적인 내용, 용량, 복잡성 등을 알지 못합니다.또한 EAV(Entity-Attribute-Value) 포맷에 대한 퍼포먼스 평가도 있지만 성공적인 비즈니스에서도 계정 데이터베이스가 10,000명을 넘는 사용자는 거의 없다고 생각합니다.따라서 사용자당 매우 많은 속성이 있더라도 이러한 유형의 최적화를 필요로 하지 않는 비교적 작은 EAV 테이블을 검토해야 합니다(다른 분야에서는 몇 가지 다른 최적화 방법을 사용하는 것이 좋습니다).
또한 일반적인 사용 사례에서는 다른 쿼리에 비해 계정 데이터베이스에 대한 문의가 상대적으로 적기 때문에 애플리케이션의 계정 관련 기능에 대해 사소한 성능 고려 사항을 고려해야 하는 또 다른 이유가 됩니다.

제안:"재규격화된 속성"을 사용할 수 있습니다.
단일값, 특히 짧은 Atribute의 경우 Entity 테이블(이 경우 USER 테이블) 내에서 Atribute를 이동(또는 복제)할 수 있습니다.이렇게 하면 항목이 삽입 또는 업데이트될 때 약간의 논리가 도입되지만, 이로 인해 많은 조인(또는 하위 쿼리)이 생성되고 가장 일반적인 사용 사례를 지원하기 위해 다중 필드 인덱스를 고려할 수 있는 기회가 제공됩니다.

(*) 리트가 있나요?
이러한 제한에 대해서는 읽어본 적이 없습니다.Oracle도 한때 1,000개의 제한이 있었습니다.MS SQL도 마찬가지입니다.물론 모든 서버가 SQL 문의 전체 길이에 따라 제한을 갖습니다만, 이것은 매우 큰 숫자입니다.만일 그 제한을 우연히 발견하게 되면 다른 문제가 발생합니다.;-)

MySQL의 IN Clause 자체에는 이러한 제한이 없습니다.저는 8000개의 요소로 잘 작동하려고 했습니다.스택 오버플로 오류는 선언된 변수일 수 있습니다.

IN()절 MariaDB는 성능 향상을 위해 임시 테이블을 자동으로 생성하는 것으로 보입니다.은 것, 음, 음, 음, 음, 음을 사용해서 볼 수 있다를 사용해서 볼 수 .EXPLAIN.

언급URL : https://stackoverflow.com/questions/1532366/mysql-number-of-items-within-in-clause

반응형