색인이 설정되지 않은 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 | |
+--------------------+------------------------------+------+-----+---------+-------+
이 대답은 나에게 일반적인 것 같다 - 당신은 WHERE 성 '% 스미스 %''나'SUBSTRING (ID, 2, 1) = '2'' 이익을하지 않습니다처럼', 알고 전혀 색인에서. – RedFilter
정보 부족으로 더 구체적인 답변을 제시하기가 어렵습니다. 그러나 이러한 조건에서도 쿼리가 여전히 인덱스의 이점을 얻을 수 있습니다. 테이블 레코드가 큰 경우 전체 인덱스 스캔을 사용하여 전체 테이블 스캔 대신 레코드를 검색 할 수 있습니다. 그러나 MySQL은 후기 행 검색을 지원하지 않으므로 쿼리 재 작성이 필요할 수 있습니다. – Quassnoi
'@ Orbman' :'Smith'가 대문자로 쓰여진 첫 번째 질의는'FULLTEXT' 인덱스로부터 이익을 얻고, MATCH (LastName) AGAINST ('+ Smith *'in BOOLEAN MODE)'로 재 작성됩니다. 이것은 물론 McSmiths와 비슷한 성에서 실패 할 것입니다. – Quassnoi