2014-01-22 3 views
0

나는 10 억 개의 매우 큰 테이블을 가지고 있습니다.PHP - SQL을 최적화 매우 큰 테이블에 대한 복수 행을 선택

foreach($idArray as $id){ 
    'SELECT DIE_X, DIE_Y, LOG_INDEX, TREND_ELEMENT, TREND_DATA FROM trend_data_level_5 WHERE TREND_INDEX =' $id; 
    $result = mysql_query($query); 
} 

이 방법은 내 테이블이 커지면 길어질수록 오래 걸립니다. 내 SQL 데이터베이스에 innoDB 엔진을 사용하고 있습니다.

나는 타이머를 돌렸다. 위의 루프는 ~ 15 mil의 테이블 크기에 대해 ~ 17 초을 취했다. 얼마나 많은 시간이 걸릴지 상상해보십시오!

이 시간을 현저하게 줄일 수 있습니까? 그렇다면 최상의 접근 방식은 무엇입니까?

편집 : 여기에 테이블이 어떻게 표시되는지를 보여줍니다

같은
------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table    | Create Table 
                                       | 
+--------------------+-------------------------------------------------------------------------------------------------------------------------------- 
------------------------------------------------------------------------------------------------------------------------------------------------+ 
| trend_data_level_5 | CREATE TABLE trend_data_level_5 (
    LOG_INDEX int(5) DEFAULT NULL, 
    DIE_X int(3) DEFAULT NULL, 
    DIE_Y int(3) DEFAULT NULL, 
    TREND_INDEX int(10) DEFAULT NULL, 
    TREND_ELEMENT varchar(3) DEFAULT NULL, 
    TREND_DATA int(5) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 | 
+--------------------+-------------------------------------------------------------------------------------------------------------------------------- 
------------------------------------------------------------------------------------------------------------------------------------------------+ 
+0

'ID'는 테이블의 키입니까? 또는 적어도 색인을 생성 했는가? 'ID' (int, varchar 등)의 크기는 얼마입니까? 색인이 생성되었다고 가정하면 전체 색인을로드 할만큼 메모리가 충분합니까? –

+0

게시물을 편집하고 'SHOW CREATE TABLE table_1'의 결과를 추가하여 열, 데이터 유형 및 색인을 볼 수 있습니다. –

+0

좋아요, 적절한 수정을했습니다. 테이블 구조를 확인하십시오 –

답변

0

먼저 MYSQLI 확장자를 사용합니다. (

$list = implode(",", $idArray); 
$query = "SELECT DIE_X, DIE_Y, LOG_INDEX, TREND_ELEMENT, TREND_DATA FROM trend_data_level_5 WHERE TREND_INDEX IN ($list)"; 
$stmt = $your_mysqli_object->prepare($query); 
$stmt->execute(); 
$stmt->store_result(); // This releases the real transaction and charges the data to PHP 

while($stmt->fetch()) 
{ 
    //... 
} 

그것은 가장 최적화 된 코드가 아닐 수도 여기에 더 많은 정보를 원하시면 : 둘째 MySqli manual

, 나는 $idArray 배열을 가질 수 얼마나 많은 항목 모르겠지만,이 같은 문장을 수행 할 수 있습니다 나는 그렇지 않다는 것을 확신합니다.) 그러나이 경우 은 한 번만 쿼리를 수행하고을 수행 한 다음 결과를 반복하여 마법을 수행합니다.

나는 당신을 도왔기를 바랍니다. 제대로 작동하는지 또는 더 나은 솔루션을 찾았는지 알려주십시오. 나도 배우고 싶다!

+0

SELECT IN 쿼리는 루프에서 개별 쿼리를 수행하는 것보다 훨씬 빠르게 실행되는 것 같습니다. 나는 정말로'mysqli'를 들여다 보지 않았다. 향상된 쿼리 성능을 제공합니까? –

+0

객체 지향적이기 때문에 코드를 더 깨끗하게 볼 수 있습니다. 그러나 나는 그것을 깊이 조사하지 않았다. 나는 그것이 너무 오래되지 않았기 때문에 그것이되어야한다고 생각한다. 그리고 그것이 적절하고 최적화 된 것으로 가정한다. –

+0

이 게시물을보십시오 : http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php –

0

trend_index은 그래서 기본 키 사용됩니다. 그렇지 않으면 trend_index를 사용하여 색인을 작성하십시오. CREATE INDEX B ON T1 (B);

고유 한 경우 고유 한 색인 C를 T1 (C)에 작성하십시오.

간단한 쿼리만으로도 충분합니다.

0

이것은 매우 기본적인 질문입니다. 대답은 인덱스를 사용하는 것입니다 (아무 것도 가지고 있지 않습니다). 그리고 웹에서 어떻게 할 지 알아내는 데 도움이되는 많은 리소스가 있습니다.

0

PDO를 사용하는 것이 좋습니다. 그런 다음 하나의 준비된 쿼리를 사용해야합니다 (루프의 쿼리는 매우 느리기 때문에 실제로는 좋지 않습니다!) $pdo->fetchAll()을 수행하면 양방향 배열 (또는 배열 배열을 가져옵니다. 필요). 그런 다음 해당 배열을 통해 안전하게 foreach을 수행 할 수 있습니다.
추가 설명이 필요하면 알려주세요.

관련 문제