2017-05-12 7 views
2

처음에는 어리석은 질문처럼 보일지 모르지만 저를 들어보세요.필드를 검색하지 않고 % ""% 검색하는 것의 차이점

저는 현재 끔찍한 검색 기능을 개선하고 있습니다 (여러개 모두 한 출력에 사용됨). ~ 6000 개의 이름의 데이터베이스에서 개인 이름의 일부를 검색 할 때 fname LIKE % first_name % 및 lname LIKE % last_name % 및 열거 형 LIKE % employee_number %. 문제는 이름, 성 또는 직원 번호를 지정하지 않으면 WHERE 검색에서이 필드를 지정하는 대신 검색을 통해 이름 입력에서 검색된 빈 문자열을 전달한다는 것입니다 (예 : "%와 lname LIKE %" "%와 enum LIKE %" "%.

저는 SQ 성능에 대한 새로운 경험이 있습니다. 논리적 인 웹 개발자이며, 얼마나 흥미로운 지 궁금합니다. 단지 그들이 비어있는 경우 검색의 사양으로 해당 필드를 포함하지 않는 반대로이 속도와 효율성에 미칠 변형. 당신의 도움 :) 물론

+0

질문을 명확히 할 수 있습니까? 동적으로 열을 선택 (또는 선택하지 않는 것)하는 것이 더 나은지 물어 보는 것인가요? 모든 열을 선택하고 where 절에 빈 문자열을 전달하는 것입니까? –

+0

그래, 사용자가 이름성에 대해 아무런 값도 입력하지 않고 동일한 검색을 수행하지만 처음에 검색을 조건으로 지정하지 않는 직원 번호를 입력하면 새로운 쿼리를 작성하는 것이 가치가 있는지 묻는 것이 더 좋습니다. last와 emp num을 모두 사용하거나 이미 존재하는 쿼리에 blank ""를 전달하여 결과를 얻습니다. first_name = % ""% and last_name = % ""% and employee_number = % " "% –

+0

SQL이 현재 전혀 작동합니까? 'select where lname = ""'오직 성이 빈 문자열 인 행을 리턴 할 것이고, 그 검사를 건너 뛰지 않을 것입니다. –

답변

0

이 때 검색하는 데 시간이 더 걸릴 것입니다에 대한

감사합니다 not-unle보다 빈 필드 포함 ss는 SQL 엔진이 정말로 ""% 모든 것이 일치한다는 것을 말하면서 똑똑하다. 나는 그것을 무시한다. 나는 의심 스럽다.

당신이 물어 보는 진짜 질문은 성능 테스트를 통해서만 할 수있는 것입니다. 그것과 함께 그리고 그것없이 시도하고 결과를 비교하십시오 - 당신은 그것을 위해 필요가 없습니다.

그러나 일반적으로 이렇게 말합니다. 어쨌든 필드를 검색 할 때 색인을 생성해야합니다. 일단 색인이 생성되면, 6k 레코드에 대한 검색은 간단합니다. 빈 필드가있는 것과 없을 때의 성능 차이는 아마도 당신의 노력에 가치가 없게되고 더 중요한 것들로 이동하게됩니다.

+0

예, 감사합니다. 미안하지만 내 질문에 슈퍼 설명이 아니 었어, 나는 또한 오버플로 질문 형식을 스택에 새로운이야 그리고 나는 많은 정보를 떠날거야. 다른 테이블에서 220 만 개의 문서와 파일을 검색하고 있지만 다른 테이블을 참조하여 사람과 링크되어 있는지 확인하고, 문서 수를 얻고 성이 어디에 있는지 (예 : % lname %) 등을 설명합니다. . –

+0

@DavidBond; Np, 실제 필드를 사용할 때 성능 문제가 여전히 발생합니다. 예를 들어 필드를 사용할 때 빈 필드와 50 초 쿼리를 사용하여 500ms 쿼리를 허용하지 않는다고 가정합니다. 필드가있을 때 검색을 최적화하는 작업을 수행하십시오. 일단 당신이 그 하나를 충분히 빨리 얻으면, 빈 필드 질문은 대부분 사라져 버린다. 즉, 잘못된 질문을하는 것입니다. 문제는 "이 필드를 검색 할 때 2 백만 개의 레코드를 효율적으로 쿼리하는 방법"입니다. – SteveJ

0

lname like "%%" 대신 용어를 제외하면 약간의 성능 향상이 있습니다. 쿼리 select null like "%"은 null을 반환하므로 각 행의 각 값에 대한 검사를 수행해야합니다.

이 쿼리 속도를 높이려면 관련 열에 Full Text Search 인덱스를 추가하는 것이 좋습니다.

0

~ 6000 행으로, 나는 그 변형이 하드웨어 및 리소스 가용성 (웹 호스팅 계정 대 전용 서버)에 달려 있다고 생각합니다. 당신은 채워지지 않은 입력을 배제함에있어 올바른 길을 가고 있으며, 그렇게하는 절차를 설계 할 수 있어야합니다. https://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html

이러한 참조는 기본적으로 모든 버전 5.x의 적용 : 여기 인덱싱에 https://dev.mysql.com/doc/refman/5.7/en/if.html 을 정보 :

는 5.7을 사용하는 경우, 당신은 여기 절차에 대한 설명서를 찾을 수 있습니다

+0

다른 테이블에 대해 언급하는 것을 잊어 버렸습니다. 나는 위에서 언급 한 것들을 바꿀 것이라고 확신하지만 귀하의 회신과 자원에 대해 감사드립니다! –