인덱싱에 관한 한, SELECTS의 속도를 높이기 위해 WHERE 절에서 검색 할 모든 필드를 인덱싱하는 것이 적절합니까? 예를 들어 내 데이터베이스에는 이름, intrestCode, zip, 설명 및 전자 메일과 같은 사용자 정보를 저장하는 프로필 테이블이 있습니다. 프로파일 레코드는 사용자 ID와 고유하게 일치하는 PRIMARY id 컬럼으로 식별됩니다. 프로필은 zip 및 intrestCode (SELECT `blah`,`blah`... FROM profile WHERE zip=?
, SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=?
)로 검색되므로 zip 및 intrestCode 인덱스를 만들었습니다. 내가 제대로하고 있니?올바른 인덱싱 MySQL
답변
기본적으로 올바른 소리입니다. 당신은 당신이 동일한 쿼리에서 같은 테이블에 두 개의 서로 다른 인덱스를 사용할 수 없다는 것을 알고, 그렇게해야 당신은 실행 한 경우
CREATE INDEX `zip` ON `profile` (`zip`);
CREATE INDEX `intrestCode` ON `profile` (`intrestCode`);
다음 쿼리
SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=?
단지에서 하나 개의 테이블을 찾아 볼 수 있습니다 색인 여기에 비밀은 당신과 같이, 두 개의 테이블에 단일 인덱스를 만들 수 있다는 것입니다 :
CREATE INDEX `zip+intrestCode` ON `profile` (`zip`, `intrestCode`);
MySQL은 WHERE 절에서 혼자 두 zip
을 사용하는 쿼리에 대해이 작업을 사용하거나 사용 모두 zip
및 intrestCode
있지만 WHERE 절에 intrestCode
만 사용하는 쿼리
(이것은 각 인덱스는 전체 테이블을 포함되기 때문이다. MySQL이 시도하고 다른 테이블에서 zip
및 intrestCode
을 본다면, 두 번째 인덱스에서 관련이없는 행의 다음이 검색 될 많은. 따라서, 그것은 단지 본다 하나의 인덱스. 두 컬럼 모두에서 인덱스를 사용하려면 두 컬럼을 모두 포함하는 하나의 인덱스가 필요합니다.)
나는 기본적으로 그렇다고 믿습니다. 추가. 제 점이 _ 생하도록 데이터베이스를 모니터하고 결과에 따라 조회 W 테이블을 최적화해야합니다.
인덱싱 관계 데이터베이스는 약간 예술입니다. 가장 좋은 방법은 관련된 모든 쿼리를보고 관련된 인덱스에 인덱스를 넣는 것입니다. 쿼리가 사용할 인덱스를 보려면 EXPLAIN
을 사용하십시오.
그러나 MySQL은 한 번에 테이블의 인덱스 하나만 사용할 수 있습니다. 따라서 한 번에 여러 열에 인덱스를 넣을 수 있습니다. 또한 인덱스 시작 부분에 열만 있으면 MySQL은 다중 열 인덱스를 사용할 수 있습니다. 귀하의 예제에서, 나는 다중 열 인덱스 zip
과 intrestCode
을 함께 두 쿼리를 도울 것이므로 넣어 것입니다. 그렇게하면 zip
에 별도의 색인이 필요하지 않습니다.
는 어떻게 하나의 최대 속도는 WHERE'zip' = profiles''로부터'email','name'을 선택 것인가? &&'intrestCode' =? . 보시다시피 2 열을 사용합니다. 2 개의 별도 색인을 사용하지 않겠습니까? – user974896
당신은 다중 열 인덱스를 수행합니다'TABLE 프로파일 추가 INDEX (우편, intrestCode)' – staticsan
일반적으로 where 절에 참여하거나 where 절에 포함 할 컬럼에 인덱스를 추가하려고합니다 . 두 열의 인덱스는 두 열의 인덱스 각각과 다릅니다. 또한 여러 열에 대한 색인이있는 경우 순서가 중요합니다.
두 개의 열 A와 B가 있고 A와 B의 순서로 두 개의 열 인덱스가 있다고 가정 해 보겠습니다.삼가지 경우가 있습니다
열 A에 대한 절- : 인덱스가
- 을 사용하지 않는 열에 대한 절과 B : 인덱스가 사용되는 열 B에 대한 절
- 인덱스가 사용됩니다
통계와 마찬가지로 색인 생성은 예술이며 100 % 시간을 적용하는 규칙은 없습니다. Explain 계획을 사용하여 쿼리가 수행되는 방식을 확인하고 적절하게 조정하십시오.
- 1. mysql 부분 인덱싱, 역 인덱싱
- 2. InnoDB를위한 인덱싱 된 MySQL 인덱싱/검색 대체?
- 3. MySQL 테이블 인덱싱
- 4. PHP에서 Mysql 테이블 인덱싱
- 5. Mysql 파티션 인덱싱
- 6. MySQL - 인덱싱 질문
- 7. mysql 태그 테이블 인덱싱
- 8. mysql 필드 인덱싱
- 9. Maxmind에서 도시로 - mysql 인덱싱
- 10. mysql 데이터베이스에서 조인 인덱싱
- 11. MySQL DB를위한 최상의 인덱싱 전략
- 12. MySQL MyISAM이 텍스트 컬럼 인덱싱
- 13. MySql TEXT 열을 인덱싱 하시겠습니까?
- 14. 하나의 MySQL 컬럼 값 인덱싱
- 15. where 절을 사용하여 올바른 열을 인덱싱
- 16. mysql autoincrement가 올바른 타입인가?
- 17. null 타임 스탬프에서 mysql 테이블 인덱싱
- 18. MySQL - 인덱싱 - 내가 뭘 잘못하고 있니?
- 19. MySQL 전체 텍스트 인덱싱 제한 사항?
- 20. 의 MySQL 데이터베이스 인덱싱 성능 문제
- 21. 인덱싱
- 22. 데이터베이스에 파일 인덱싱
- 23. 데이터베이스에 파일 이름 인덱싱
- 24. UITableView 인덱싱
- 25. 올바른 PHP MYSQL 배열 사용
- 26. 이 올바른 mysql 제약 구문입니까?
- 27. MySQL 쿼리를 최적화하는 올바른 방법
- 28. 지역 필터링을위한 올바른 mysql 구조
- 29. 올바른 방법으로 MySQL 테이블을 설정하십시오.
- 30. 올바른 방법으로 MYSQL 테이블에 가입하십시오.
문제는 내가 사용자가 검색하는 방법을 몰라을 변경합니다. 일부는 우편 번호로만 검색하고 일부는 관심사로 검색하기를 원할 수도 있고 다른 일부는 모두 검색하려고 할 수도 있습니다. 이것은 일반적인 사건처럼 보입니다. 해결책이 없습니다 (많은 테이블이 부족합니다)? 멀티 컬러 색인을 만들고 미사용 필드를 와일드 카드로 작성하면 효과가 있습니까? Zip 전용 : SELECT * FROM profiles 여기서 zip =? && intrestCode LIKE '%'. Intrest code 만 해당 : SELECT * from WHERE zip LIKE '%'&& intrestCode =? 둘 다 : 프로필에서 SELECT * WHERE zip =? && intrestCode =? – user974896
아니요 필드 간에는 엄격한 관계가 있어야합니다. 두 개의 필드가 있다면'zip'과'intrestCode'와'intrestCode'만으로 두 개의 인덱스를 쉽게 생성 할 수 있습니다. 필드가 더 많은 경우 모든 조합을 설명하기가 어려워집니다. 이 시점에서 각 필드에 대해 하나의 인덱스를 작성하고 옵티마이 저가 최상의 옵션을 선택하도록하는 것이 가장 좋습니다 (이벤트는 동일한 종류의 효율성 향상을 얻을 수는 없지만). DB의 크기에 따라 다중 열 인덱스를 만드는 것은 가치가 없을 수도 있습니다. 여기에는 몇 가지 판단이 필요합니다. –
한 가지 더 궁금한 점이 있습니다. 실제로 많은 조합을 감추기 위해 몇 가지 지표가 추가 될 것입니다 (UPDATE, INSERT 또는 SELECT 시간이 오는가?), 아니면 디스크 공간면에서 비용이 많이 듭니다. 디스크 공간은 저렴한 비용으로 거의 무한한 자원입니다. – user974896