>백엔드 개발 >PHP 튜토리얼 >데이터베이스 하위 테이블 최적화 실습: PHP 프로그래밍에 적용

데이터베이스 하위 테이블 최적화 실습: PHP 프로그래밍에 적용

PHPz
PHPz원래의
2023-06-22 10:00:08756검색

대량 데이터에 대한 동시 액세스에 직면하여 기존의 단일 데이터베이스 아키텍처는 성능 문제를 일으키는 경우가 많습니다. 따라서 데이터베이스 하위 데이터베이스와 하위 테이블은 데이터베이스 성능을 최적화하는 데 필요한 수단 중 하나가 되었습니다. 이 기사에서는 PHP 프로그래밍에서 데이터베이스 샤딩과 테이블 샤딩에 대한 실제적인 방법과 주의 사항을 자세히 소개합니다.

1. 데이터베이스 샤딩이란 무엇인가요?

샤딩이라고도 하는 데이터베이스 샤딩은 대규모 데이터베이스를 여러 개의 작은 데이터베이스로 분할하거나 큰 테이블을 여러 개의 작은 테이블로 분할하여 저장 및 처리를 위해 서로 다른 물리적 머신에 배포하는 것을 의미합니다. 데이터베이스의 처리 능력과 성능을 향상시킵니다. 하위 데이터베이스 및 하위 테이블의 장점은 주로 다음과 같습니다.

1. 데이터베이스의 동시 액세스 기능을 개선하고 단일 실패 지점 문제를 완화합니다.

2. 데이터 저장을 분산화하여 시스템의 전반적인 처리 능력을 향상시킵니다.

3. 데이터 백업 및 복구 시간을 단축하고 운영 및 유지 관리 효율성을 향상시킵니다.

4. 사업의 수평적 확장을 지원하고 수평적 확장 비용을 절감합니다.

2. PHP 프로그래밍에서 하위 라이브러리와 하위 테이블 연습

1. 하위 라이브러리

PHP 프로그래밍에서는 하나의 마스터와 여러 개의 슬레이브를 사용하여 하위 라이브러리를 구현할 수 있습니다. 단일 마스터, 다중 슬레이브 아키텍처에서 쓰기 작업은 마스터 라이브러리에서만 수행될 수 있는 반면 읽기 작업은 여러 슬레이브 라이브러리에서 수행될 수 있습니다. 구체적인 구현 방법은 다음과 같습니다.

1) 먼저 PDO를 통해 메인 라이브러리에 연결하기 위해 DB 클래스를 정의해야 합니다.

class DB{

private static $instance;
private $pdo;

private function __construct()
{
    $config = ['host' => '127.0.0.1',
               'port' => '3306',
               'dbname' => 'main',
               'username' => 'root',
               'password' => '123456',
               'driver' => 'mysql'
              ];
    $dsn = $config['driver'].":host=".$config['host'].";port=".$config['port'].";dbname=".$config['dbname'];
    $this->pdo = new PDO($dsn, $config['username'], $config['password']); 
}
public static function getInstance(){
    if(self::$instance === null){
        self::$instance = new self();
    }
    return self::$instance;
}
public function getPdo(){
    return $this->pdo;
}

}

2) 그런 다음 DB 클래스에 넣고 쿼리를 위해 슬레이브 데이터베이스를 무작위로 선택합니다.

public function select($sql, $params){

    try{
        $slave = ['slave1', 'slave2', 'slave3'];
        $dbIndex = array_rand($slave);
        $config = ['host' => '127.0.0.1',
                   'port' => '3306',
                   'dbname' => $slave[$dbIndex],
                   'username' => 'root',
                   'password' => '123456',
                   'driver' => 'mysql'
                  ];
        $dsn = $config['driver'].":host=".$config['host'].";port=".$config['port'].";dbname=".$config['dbname'];
        $pdo = new PDO($dsn, $config['username'], $config['password']);
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }catch(PDOException $e){
        die($e->getMessage());     
    }   

}

위의 방법을 통해 무작위로 선택할 수 있습니다. 읽기 작업 중 쿼리를 위한 슬레이브 데이터베이스를 사용하여 라이브러리 분할을 달성합니다.

2. 테이블 분할

PHP 프로그래밍에서는 ID 패리티를 사용하여 데이터를 여러 테이블에 분산시킬 수 있습니다. ID가 짝수이면 짝수 테이블에 저장되고, ID가 홀수이면 홀수 테이블에 저장됩니다. 구체적인 구현 방법은 다음과 같습니다.

1) 먼저 데이터베이스와 테이블 샤딩 로직을 연결하는 DbUtil 클래스를 정의합니다.

class DbUtil{

private static $instance;
private $pdo;

private function __construct(){
    $config = ['host' => '127.0.0.1',
               'port' => '3306',
               'dbname' => 'test',
               'username' => 'root',
               'password' => '123456',
               'driver' => 'mysql'
              ];
    $dsn = $config['driver'].":host=".$config['host'].";port=".$config['port'].";dbname=".$config['dbname'];
    $this->pdo = new PDO($dsn, $config['username'], $config['password']); 
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

public static function getInstance(){
    if(self::$instance === null){
        self::$instance = new self();
    }
    return self::$instance;
}

public function getPdo(){
    return $this->pdo;
}

public function selectById($id){
    $tableName = self::getTableName($id);
    $sql = "SELECT * FROM ".$tableName." WHERE id=:id";
    $params = [':id' => $id];
    $stmt = $this->pdo->prepare($sql);
    $stmt->execute($params);
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $result;
}

private static function getTableName($id){
    $isEven = $id % 2 == 0;
    if($isEven){
        return 'even_table';
    }else{
        return 'odd_table';
    }
}

}

2) 그런 다음 클라이언트 코드에서 구현합니다.

$id = 123;
$dbUtil = DbUtil::getInstance();
$result = $dbUtil->selectById($id);

위의 방법을 통해 데이터를 다양한 테이블에 분산시킬 수 있습니다. ID의 패리티.

3. 데이터베이스 샤딩 및 테이블 샤딩 시 주의사항

  1. 데이터 일관성 문제: 데이터베이스 및 테이블을 샤딩한 후 데이터가 여러 데이터베이스/테이블에 분산되어 데이터 불일치가 발생할 수 있습니다. 데이터베이스와 테이블을 샤딩할 때 일관성 문제를 고려하고 일관된 해싱 또는 마스터-슬레이브 동기화와 같은 기술을 사용하여 데이터 동기화를 달성해야 합니다.
  2. 하위 데이터베이스 및 하위 테이블 시나리오 선택: 데이터 양이 매우 큰 경우에만 하위 데이터베이스 및 하위 테이블을 사용해야 합니다. 데이터 양이 적은 기업의 경우 독립형 데이터베이스를 사용하여 처리할 수 있습니다.
  3. SQL 문 최적화: 데이터베이스와 테이블을 샤딩한 후 쿼리 효율성을 높이기 위해 SQL 문을 최적화해야 합니다. 최적화 방법에는 적절한 인덱스 사용, 하위 쿼리 사용 방지, 단순화된 쿼리 문 병합 등이 포함됩니다.

4. 요약

PHP 프로그래밍에서는 데이터베이스의 처리 능력과 성능을 향상시키기 위해 하위 데이터베이스와 하위 테이블이라는 방법을 사용할 수 있습니다. 데이터베이스와 테이블을 분할하면 시스템의 동시 처리 기능이 향상되고 단일 실패 지점의 위험이 줄어듭니다. 그러나 하위 데이터베이스 및 하위 테이블을 사용하기 전에 데이터 일관성 문제를 고려하고 SQL 문을 최적화하여 데이터베이스 쿼리 효율성을 향상시켜야 합니다.

위 내용은 데이터베이스 하위 테이블 최적화 실습: PHP 프로그래밍에 적용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.