2012-01-16 2 views
0

Amazon.com의 주문 번호를 MySQL 테이블에 저장해야하는 곳에 문제가 있습니다. Amazon.com 주문 번호는 102-1234567-1234567 (17 개의 숫자와 2 개의 하이픈)과 같은 숫자와 하이픈으로 구성됩니다. 이 "숫자"는 하이픈 때문에 문자열로 저장되는 경우가 있는데,이 열에 대한 검색은 숫자 검색 대신 문자열 검색입니다.MySQL : 하이픈을 포함하는 Amazon.com의 주문 번호 저장

지금 당장은 VARCHAR (19)로 저장하고 있지만 저장하고 검색하는 것이 더 효율적이고 빠르도록 저장하는 방법이 있습니까? 예를 들어, 각 숫자 세그먼트를 하나의 열 (하나의 주문 "숫자"에 대해 총 3 열)로 구문 분석하고 을 수행하는 대신 ... WHERE colA=102 AND colB=1234567 AND colC=1234567을 수행하여 특정 주문을 가져 오는 방법을 생각했습니다. 나는 이전 바이트가 훨씬 더 적은 바이트를 사용한다는 것을 알고 있지만 또한 빠르다. 제가 작업하고있는 테이블은 100K 개 이상의 행을 가지고 있으며 매일 작은 조각으로 자랍니다.

구조를 수정해야하는 방법이나 내가 어떻게해서는 안되는지에 대한 의견이나 의견이 있으십니까? 티아!

+0

대단히 감사합니다. VARCHAR (X), X> 19,이 칼럼의 색인을 생성하고,'LIKE' 대신에'='를 사용합니다. 그러나 이점을 읽어야합니다. 차이점에 익숙하지 않습니다. – musicliftsme

답변

2

아마존의 현재 주문 번호로 된 3 개의 숫자로 된 숫자를 분리하지 마십시오. 데이터베이스 엔진은 열의 색인이 제대로 설정된 경우이 번호로 주문을 찾을 수있을 정도로 빠릅니다. 나는 당신의 질문에서 '조숙 한 최적화'감각을 여기에서 얻는다.

는 이러한 제안을 고려 :

  • varchar(100)에 열을 확대 또는 19보다 큰 무언가가 당신은 공급 업체에 의존하고 있으며, 그 구조는 절대 변하지 않을 것이라고 큰 가정을 만드는.

  • 이 열에 색인을 넣으십시오. 100K 행은 매우 작은 데이터 집합입니다.

  • 현재 수행중인 것처럼 평등을 찾는 것이 아닙니다. WHERE Order='123-456-234

3

이러한 주문 번호는 사실 숫자가 아닙니다. 이것들은 문자열이며, 문자열로 저장되어야합니다.

아마존의 주문에 대해 자세히 알지 못하지만 항상 길이가 19자인 경우 VARCHAR (19) 대신 CHAR (19)를 사용할 수 있으며 멀티 바이트 대신 ASCII 문자 세트를 사용할 수 있습니다. 그걸 조금 더 빨리 만들어야합니다. 또한 전체적으로 열 (예 : 길이 19)을 포괄하는 색인을 작성하면 성능이 향상 될뿐만 아니라 LIKE 대신 =을 사용할 수도 있습니다.

+1

그들은 19 * 오늘 *입니다. –

+0

+1은 "좋아요 대신 = 사용"뿐입니다. –