2017-10-25 5 views
1

가장 잘 설명하는 방법이 확실하지 않으므로 나와 양육하십시오. 4 개의 열이있는 표가 있다고 가정 해 봅시다 : id (int 11, indexed), title, content, category (varchar 5).큰 WHERE IN() 절이있는 MySQL 성능

사용자가 카테고리를 선택했습니다. 각 범주는 최대 999 개의 개체를 포함 할 수 있습니다. SELECT id FROM table WHERE category = ?을 사용하여 모든 객체의 목록을 얻습니다.

그런 다음 사용자가 개체를 선택/선택 취소하게하십시오. 그런 다음 나머지 선택된 객체의 내용을 선택해야합니다.

이제 내 질문은 다음과 같습니다. SELECT content FROM table WHERE id IN($array)을 사용할 때 성능에 대해 걱정해야합니까? SELECT content FROM table WHERE category = ? AND id IN($array)을 사용하는 것이 더 좋을까요? 여기에있는 아이디어는 IN을 수행하기 전에 999 개의 객체로 필터링됩니다 ...

이 내용이 의미가 있습니까? 또는 IN()을 전혀 사용하지 않아야합니까?

+0

, 당신은 걱정 할 필요가 없습니다 성능이 너무 많이. –

+0

MySQL의 EXPLAIN 구문을 읽고이를 사용하여 두 쿼리의 차이점을 이해하십시오. –

+0

'category'에 대한 색인을 생성해야합니다. – nogad

답변

0

항상 화면에 content이 표시되는 것 같습니다.

999는 목록입니다. 귀하의 UI를 다시 생각하십시오.

선택/선택 해제하면 어떻게됩니까? content은 회색으로 표시됩니까? 그렇다면 UI 문제이며 데이터베이스 문제는 아닙니다. 현재 "선택한"하위 집합을 저장하는 경우 저장 방법은? 그리고 각 선택/선택 취소 후에 저장 하시겠습니까? 또는 "제출"을 클릭 할 때까지 기다리시겠습니까?

다른 말로하면 이것이 왜 데이터베이스 질문인지 모르겠다. 문제의 쿼리에 돌아 가기

: 나는 당신이 적절한 색인으로, 그렇다하더라도 수만 수천 개의 행과있을 때까지 너무 많은 성능에 대해 걱정하지 것이다

INDEX(category) 
SELECT ... FROM tbl WHERE category = ...; -- This is optimal 

PRIMARY KEY(id) 
SELECT ... FROM tbl WHERE id IN (...); -- optimal for an arbitrary set 

INDEX(category, id) 
SELECT ... FROM tbl WHERE category = ... AND id IN (...) 
    -- use this only if you both parts are needed for filtering 
    -- not for optimizing 
+0

릭의 답변 주셔서 감사합니다. 그리고 저는 999 항목이 많다는 것을 압니다. 그러나 그것은 최대입니다. 실제로는 카테고리 당 50 ~ 100 행을 기대합니다. 각 행에는 약 20 개의 셀 10 진수 (6,2) 또는 varchar (10)가 있습니다. 행은 표에 표시되고 값은 편집 할 수 있습니다 (행마다 또는 모든 행을 일괄 적으로 편집 할 수 있으므로이 모든 것을 표시해야합니다). 편집 후, 템플릿을 사용하여 각 행에 대한 텍스트 파일이 생성됩니다 ... 나는 PHP/SQL은 내가하려는 일을 성취하기 위해 최선의 선택과는 거리가 멀다는 것을 알지만, 내가 알고있는 언어입니다 ... 그래서 그래^_ ^ –