2010-01-15 2 views
3

색인이 설정되지 않은 9 백만 개의 레코드가있는 mysql 테이블이 있습니다. 공통 ID를 기반으로 다른 테이블에이 작업을 참여시켜야합니다. 이 ID에 색인을 추가하겠습니다. 그러나 다른 필드도 절을 선택하십시오.조인 된 테이블에 인덱스를 추가하는 경우

의 모든 필드에 인덱스를 추가해야합니까? 절?

의 필드는 무엇입니까? 절을 선택 하시겠습니까? 모든 필드에 대해 하나의 색인을 만들거나 필드 당 색인을 만들어야합니까?

업데이트 - 추가 된 테이블 및 쿼리 여기

는 쿼리입니다 - 나는 상점 이름과 상점 ID (상점 이름에 따라 항목에 의해 판매, 항목 이름 및 항목 ID의 수를 얻을 필요

+----------------+------------------------------+------+-----+---------+-------+ 
| Field   | Type       | Null | Key | Default | Extra | 
+----------------+------------------------------+------+-----+---------+-------+ 
| StoreId  | bigint(20) unsigned   | NO |  | NULL |  | 
| ItemId   | bigint(20) unsigned   | NO |  | NULL |  | 
+----------------+------------------------------+------+-----+---------+-------+ 

및 항목 테이블 : 스스로에 의해 ID는

여기
SELECT COUNT(*) as salescount, items.itemName, CONCAT(items.ID, items.productcode) as itemId 
FROM items JOIN sales ON items.itemId = sales.itemId WHERE items.StoreName = ? 
AND sales.storeID = ? GROUP BY items.ItemId ORDER BY salescount DESC LIMIT 10; 

가 판매 테이블) 고유하지

+--------------------+------------------------------+------+-----+---------+-------+ 
| Field    | Type       | Null | Key | Default | Extra | 
+--------------------+------------------------------+------+-----+---------+-------+ 
| ItemId    | bigint(20) unsigned   | NO | PRI | NULL |  | 
| ProductCode  | bigint(20) unsigned   | NO |  | NULL |  | 
| ItemName   | varchar(100)     | NO |  | NULL |  | 
| StoreName   | varchar(100)     | NO | PRI | NULL |  | 
+--------------------+------------------------------+------+-----+---------+-------+ 

답변

4

당신이해야 인덱스 WHERE 절에와 WHEREJOIN 절에서 구동 테이블의 선두 테이블에서 검색되는 모든 필드를 표시합니다. 더 테이블 조회가 필요하지되기 때문에, 또한 도움이 될 것입니다 (SELECTORDER BY 조항 포함) 쿼리에 사용 모든 필드를 충당하기 위해 인덱스를 만들기

.

여기에 검색어를 게시하면 테이블 색인을 생성하는 방법을 알려줄 수 있습니다.

업데이트 :

1로에서 가장 1 행을 반환합니다 질문이 주어진 StoreID와 판매를 (어떤이 PRIMARY KEY)을 선택하고의 항목에 참여합니다 COUNT(*)

판매액은 itemId이며 StoreName (이 조합은 PRIMARY KEY입니다.)입니다.

이 조인은 성공하거나 (12 행 반환) 실패하거나 (행을 반환하지 않음) 중 하나입니다.

성공하면 COUNT(*)1이됩니다.

정말 원하는 경우 테이블이 잘 인덱싱됩니다.

그러나 테이블 디자인이 좀 더 복잡하고 필드 정의를 복사 할 때 일부 필드를 놓친 것 같습니다.

업데이트 2 :

  1. 당신이 itemsPRIMARY KEY가 (순서대로) (StoreName, ItemId)로 정의되어 있는지 확인 sales (storeId, itemId)

  2. 에 복합 인덱스를 만듭니다.

    PK(ItemID, StoreName)으로 정의 된 경우 items (StoreName, ItemID)에 색인을 생성하십시오.

+2

이 대답은 나에게 일반적인 것 같다 - 당신은 WHERE 성 '% 스미스 %''나'SUBSTRING (ID, 2, 1) = '2'' 이익을하지 않습니다처럼', 알고 전혀 색인에서. – RedFilter

+0

정보 부족으로 더 구체적인 답변을 제시하기가 어렵습니다. 그러나 이러한 조건에서도 쿼리가 여전히 인덱스의 이점을 얻을 수 있습니다. 테이블 레코드가 큰 경우 전체 인덱스 스캔을 사용하여 전체 테이블 스캔 대신 레코드를 검색 할 수 있습니다. 그러나 MySQL은 후기 행 검색을 지원하지 않으므로 쿼리 재 작성이 필요할 수 있습니다. – Quassnoi

+0

'@ Orbman' :'Smith'가 대문자로 쓰여진 첫 번째 질의는'FULLTEXT' 인덱스로부터 이익을 얻고, MATCH (LastName) AGAINST ('+ Smith *'in BOOLEAN MODE)'로 재 작성됩니다. 이것은 물론 McSmiths와 비슷한 성에서 실패 할 것입니다. – Quassnoi

0

색인 생성은 올바른 형식으로 사용됩니다. 인덱스는 인덱스되어야 함을 기억하십시오.

리터럴 필드 및 날짜 범위와 같이 대량의 공통 데이터 비교가 필요한 필드는 물론 기본 공유 키에 인덱스를 집중시킵니다.

색인을 올바르게 사용하면 색인이 훌륭하지만 색인은 전혀 문제가되지 않습니다. 제대로 색인 된 테이블조차도 잘못된 쿼리와 손목의 제스처로 무릎을 꿇을 수 있습니다.

1

예, 색인이 있어야하지만 모든 검색어에 적합해야합니다. 귀하의 데이터베이스에 대해 잘 알지 못해서 구성 할 색인을 정확히 추천하기가 어렵습니다.

인덱스가 큰 차이를 만들어 낼 수있는 9 백만 행이면 충분하지만 약간은 땜질을 할 여유가 없습니다.

항목 (storeid), 항목 (itemid, storename), 항목 (storename, itemid), 판매 (itemid), 판매 (storeid), 판매 (itemid, storeid) 및 판매 (storeid, itemid) 그런 다음 사용되지 않는 색인은 삭제하십시오.

C.