Maison  >  Article  >  développement back-end  >  Pratique d'optimisation des sous-tables de base de données : application en programmation PHP

Pratique d'optimisation des sous-tables de base de données : application en programmation PHP

PHPz
PHPzoriginal
2023-06-22 10:00:08716parcourir

Face à l'accès simultané à des données massives, l'architecture traditionnelle de base de données unique entraîne souvent des problèmes de performances. Par conséquent, la sous-base de données et la sous-table sont devenues l'un des moyens nécessaires pour optimiser les performances de la base de données. Cet article présentera en détail les méthodes et précautions pratiques pour le partitionnement de bases de données et de tables dans la programmation PHP.

1. Qu'est-ce que le partitionnement de base de données ?

Le partitionnement de base de données, appelé partitionnement, fait référence à la division d'une grande base de données en plusieurs petites bases de données, ou à la division d'une grande table en plusieurs petites tables et à leur distribution sur différentes machines physiques pour le stockage et le traitement. pour améliorer la puissance de traitement et les performances de la base de données. Les avantages de la sous-base de données et de la sous-table incluent principalement :

1. Améliorer la capacité d'accès simultané de la base de données et atténuer le problème du point de défaillance unique.

2. Décentraliser le stockage des données pour améliorer la capacité de traitement globale du système.

3. Réduisez le temps de sauvegarde et de récupération des données et améliorez l'efficacité de l'exploitation et de la maintenance.

4. Soutenez l’expansion horizontale de l’entreprise et réduisez les coûts d’expansion horizontale.

2. Pratique de la sous-bibliothèque et de la sous-table en programmation PHP

1. Sous-bibliothèque

En programmation PHP, nous pouvons utiliser un maître et plusieurs esclaves pour implémenter une sous-bibliothèque. Dans une architecture à un maître et à plusieurs esclaves, les opérations d'écriture ne peuvent être effectuées que dans la bibliothèque maître, tandis que les opérations de lecture peuvent être effectuées dans plusieurs bibliothèques esclaves. La méthode d'implémentation spécifique est la suivante :

1) Tout d'abord, vous devez définir une classe DB pour vous connecter à la bibliothèque principale via PDO :

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) Ensuite, définissez une méthode de sélection dans la classe DB, et placez-la dans la méthode. Dans la méthode, une base de données esclave est sélectionnée au hasard pour la requête :

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());     
    }   

}

Grâce à la méthode ci-dessus, nous pouvons sélectionner au hasard une base de données esclave pour l'interrogation pendant l'opération de lecture, réalisant ainsi le fractionnement de la bibliothèque.

2. Diviser les tables

En programmation PHP, nous pouvons utiliser la parité de l'ID pour disperser les données dans différentes tables. Si l'ID est un nombre pair, il est stocké dans la table paire, si l'ID est impair, il est stocké dans la table impaire. La méthode d'implémentation spécifique est la suivante :

1) Tout d'abord, définissez une classe DbUtil pour connecter la logique de partitionnement de la base de données et de la table :

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) Ensuite, implémentez-la dans le code client :

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

Grâce à la méthode ci-dessus, nous pouvons disperser les données dans différentes tables en fonction de parité de l'ID.

3. Précautions pour le partitionnement de bases de données et de tables

  1. Problèmes de cohérence des données : après le partitionnement de bases de données et de tables, une incohérence des données peut survenir car les données sont dispersées dans plusieurs bases de données/tables. Lors du partitionnement de bases de données et de tables, vous devez prendre en compte les problèmes de cohérence et utiliser des technologies telles que le hachage cohérent ou la synchronisation maître-esclave pour réaliser la synchronisation des données.
  2. Sélection de scénarios de sous-base de données et de sous-table : Ce n'est que lorsque la quantité de données est très importante que vous devez utiliser une sous-base de données et une sous-table. Pour les entreprises disposant d’une petite quantité de données, une base de données autonome peut être utilisée pour les traiter.
  3. Optimisation des instructions SQL : après le partitionnement des bases de données et des tables, les instructions SQL doivent être optimisées pour améliorer l'efficacité des requêtes. Les méthodes d'optimisation incluent : l'utilisation appropriée des index, l'évitement de l'utilisation de sous-requêtes, la fusion d'instructions de requête simplifiées, etc.

4. Résumé

En programmation PHP, afin d'améliorer la puissance de traitement et les performances de la base de données, nous pouvons utiliser la méthode de sous-base de données et de sous-table. La sous-base de données et la sous-table peuvent améliorer la capacité de traitement simultané du système tout en réduisant le risque de points de défaillance uniques. Cependant, avant d'utiliser des sous-bases de données et des sous-tables, vous devez prendre en compte les problèmes de cohérence des données et optimiser les instructions SQL pour améliorer l'efficacité des requêtes de base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn