<?php
 
 
    /***
 
        To understand what happens here, I strongly suggest to consult the README.md file in this package !
 
 
        This example script performs the following :
 
        - Create one table, buffering_test, that we will be inserting/updating and loading data into
 
        - Time the insertion of MAX_ROWS rows using individual insert statements
 
        - Time the insertion of MAX_ROWS rows using a buffered insert object with a buffer size of MAX_INSERTS statements
 
        - Time the update of the rows created at the preceding step with individual UPDATE statements
 
        - Time the update of the rows created at the preceding step with a buffer size of MAX_UPDATES statements
 
        - Time the insertion of MAX_ROWS rows using a buffered load data object of MAX_INSERT rows
 
 
        Notes : 
 
        - your database user MUST have the FILE privilege in order to use LOAD DATA INFILE statements
 
        - since the queries built by the BufferedInsert and BufferedUpdate classes may be very large, depending on
 
          the number of queries you wanted to buffer, you may have to increase the max_allowed_packet parameter in
 
          your my.cnf (unix) or my.ini (windows) file.
 
     ***/
 
    require ( 'DbBufferedInsert.php' ) ;
 
    require ( 'DbBufferedUpdate.php' ) ;
 
    require ( 'DbBufferedLoadFile.php' ) ;
 
 
    // Customize here the access parameters to your local database
 
    define ( MYSQL_HOST        , 'localhost' ) ;
 
    define ( MYSQL_USER        , 'root' ) ;
 
    define ( MYSQL_PASSWORD        , '' ) ;
 
    define ( MYSQL_DATABASE        , 'phpclasses' ) ;
 
    define ( LOGFILE         , 'data/example.log' ) ;
 
 
    // String store entry types - one for the process name, one for the message part
 
    define ( STRING_STORE_PROCESS    , 0 ) ;
 
    define ( STRING_STORE_MESSAGE    , 1 ) ;
 
 
    // Constants related to the size of our benchmark
 
    define ( MAX_ROWS        , 50000 ) ;
 
    define ( MAX_INSERTS        , 8192 ) ;
 
    define ( MAX_UPDATES        , 8192 ) ;
 
    define ( MAX_LOAD_ROWS        , 50000 ) ;
 
 
    // Connect to your local database
 
    $dblink        =  mysqli_connect ( MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD ) ;
 
    $test_table    =  "buffering_test" ;
 
 
    // Uncomment this if you want to create a brand new database for running this test
 
    /***
 
    $query        =  "CREATE DATABASE " . MYSQL_DATABASE . " DEFAULT CHARSET latin1" ;
 
    mysqli_query ( $dblink, $query ) ;
 
     ***/
 
 
    // Select our test database
 
    mysqli_select_db ( $dblink, MYSQL_DATABASE ) ;
 
 
    // Create the test table
 
    $query        =  "
 
                CREATE TABLE IF NOT EXISTS $test_table
 
                   (
 
                    id        INT        NOT NULL AUTO_INCREMENT,
 
                    date        DATETIME    NOT NULL DEFAULT '0000-00-00 00:00:00',
 
                    intvalue    INT        NOT NULL DEFAULT 0,
 
                    randvalue    INT        NOT NULL DEFAULT 0,
 
                    strvalue1    CHAR(32)    NOT NULL DEFAULT '',
 
                    strvalue2    VARCHAR(4096)    NOT NULL DEFAULT '',
 
                    strvalue3    LONGTEXT    NOT NULL,
 
 
                    PRIMARY KEY    ( id ) 
 
                    ) ENGINE = MyISAM 
 
               " ;
 
    mysqli_query ( $dblink, $query ) ;
 
 
    // Time insertion in seconds.milliseconds of MAX_ROWS rows using individual INSERT statements
 
    echo ( "Benchmarking buffered/unbuffered operations on " . MAX_ROWS . " rows :\n" ) ;
 
 
    time_function ( 'IndividualInserts', 
 
                'Using individual INSERT statements',
 
                $dblink, $test_table, MAX_ROWS ) ;
 
 
    time_function ( 'BufferedInserts', 
 
                'Using buffered INSERT statements (size = ' . MAX_INSERTS . ')',
 
                $dblink, $test_table, MAX_ROWS, MAX_INSERTS ) ;
 
 
    time_function ( 'IndividualUpdates', 
 
                'Using individual UPDATE statements',
 
                $dblink, $test_table, MAX_ROWS ) ;
 
 
    time_function ( 'BufferedUpdates', 
 
                'Using buffered UPDATE statements (size = ' . MAX_UPDATES . ')',
 
                $dblink, $test_table, MAX_ROWS, MAX_UPDATES ) ;
 
 
    time_function ( 'BufferedLoads', 
 
                'Using buffered LOAD DATA INFILE statements (size = ' . MAX_LOAD_ROWS . ')',
 
                $dblink, $test_table, MAX_ROWS, MAX_LOAD_ROWS ) ;
 
 
    /*** END OF SCRIPT - the rest of this file contains the benchmarking functions ***/
 
 
    // time_function -
 
    //    Times the execution of the specified function and display the results.
 
    function  time_function ( $funcname, $text, $dblink, $test_table, $max_rows, $buffer_size = null )
 
       {
 
        echo ( "\t" . str_pad ( $text, 60 ) . ' : ' ) ;
 
        flush ( ) ;
 
 
        $timer_start        =  microtime ( true ) ;
 
        $funcname ( $dblink, $test_table, $max_rows, $buffer_size ) ;
 
        $timer_stop        =  microtime ( true ) ;
 
        $delta            =  round ( $timer_stop - $timer_start, 3 ) ;
 
 
        mysqli_query ( $dblink, "OPTIMIZE TABLE $test_table" ) ;
 
        mysqli_query ( $dblink, "FLUSH TABLES" ) ;
 
 
        echo ( $delta . "\n" ) ;
 
        }
 
 
 
    // IndividualInserts -
 
    //    Insert $row_count rows into the specified table using individual INSERT statements.
 
    function  IndividualInserts ( $dblink, $table_name, $row_count )
 
       {
 
        mysqli_query ( $dblink, "TRUNCATE TABLE $table_name" ) ;        // Make sure we start from a clean state
 
 
        for  ( $i = 1 ; $i <= $row_count ; $i ++ )
 
           {
 
            $strvalue    =  sha1 ( microtime ( false ) ) ;        // Well, we have to fill columns with some data...
 
            $intvalue    =  mt_rand ( ) ;
 
            $query        =  "
 
                        INSERT INTO $table_name
 
                        SET
 
                            randvalue    =  $intvalue,
 
                            date        =  NOW(),
 
                            intvalue    =  $i,
 
                            strvalue1    =  '$strvalue',
 
                            strvalue2    =  '$strvalue',
 
                            strvalue3    =  '$strvalue'
 
                       " ;
 
            mysqli_query ( $dblink, $query ) ;
 
            }
 
        }
 
 
    // BufferedInserts -
 
    //    Insert $row_count rows into the specified table using buffered INSERT statements.
 
    function  BufferedInserts ( $dblink, $table_name, $row_count, $buffer_size )
 
       {
 
        mysqli_query ( $dblink, "TRUNCATE TABLE $table_name" ) ;        // Make sure we start from a clean state
 
        $buffer        =  new DbBufferedInsert ( $table_name, [ 'date', 'intvalue', 'randvalue', 'strvalue1', 'strvalue2', 'strvalue3' ], $buffer_size, $dblink ) ;
 
 
        for  ( $i = 1 ; $i <= $row_count ; $i ++ )
 
           {
 
            $strvalue    =  sha1 ( microtime ( true ) ) ;        // Well, we have to fill columns with some data...
 
            $intvalue    =  mt_rand ( ) ;
 
            $buffer -> Add 
 
               ([ 
 
                'columns' =>
 
                   [
 
                    'randvalue'    => $intvalue, 
 
                    'intvalue'    => $i,
 
                    'strvalue1'    => $strvalue, 
 
                    'strvalue2'    => $strvalue, 
 
                    'strvalue3'    => $strvalue 
 
                    ],
 
                'computed-columns' =>
 
                   [
 
                    'date'        => 'NOW()', 
 
                    ]
 
                 ]) ;
 
            }
 
 
        $buffer -> Flush ( ) ;
 
        }
 
 
    // IndividualUpdates -
 
    //    Udpates $row_count rows into the specified table using individual UPDATE statements.
 
    //    The update consists of adding +1 to the intvalue column and an extra character to each string column.
 
    //    The id field is used for identifying the row.
 
    function  IndividualUpdates ( $dblink, $table_name, $row_count )
 
       {
 
        for  ( $i = 1 ; $i <= $row_count ; $i ++ )
 
           {
 
            $query        =  "
 
                        UPDATE $table_name
 
                        SET
 
                            randvalue    =  randvalue + 1,
 
                            strvalue1    =  'A$i',
 
                            strvalue2    =  'B$i',
 
                            strvalue3    =  'C$i'
 
                        WHERE
 
                            id = $i 
 
                       " ;
 
            mysqli_query ( $dblink, $query ) ;
 
            }
 
        }
 
 
    // BufferedUpdates -
 
    //    Updates $row_count rows into the specified table using buffered UPDATE statements.
 
    function  BufferedUpdates ( $dblink, $table_name, $row_count, $buffer_size )
 
       {
 
        $buffer        =  new DbBufferedUpdate ( $table_name, [ 'id' ], [ 'intvalue', 'date', 'randvalue', 'strvalue1', 'strvalue2', 'strvalue3' ], $buffer_size, $dblink ) ;
 
 
        for  ( $i = 1 ; $i  <= $row_count ; $i ++ )
 
           {
 
            $buffer -> Add
 
               ([
 
                'keys'        =>  [ 'id' => $i ],
 
                'columns'    =>
 
                   [ 
 
                    'intvalue'    => $i,
 
                    'randvalue'    => $i + 10000000, 
 
                    'strvalue1'    => 'XXA' . $i, 
 
                    'strvalue2'    => 'ZZB' . $i, 
 
                    'strvalue3'    => 'ZZC' . $i 
 
                    ],
 
                'computed-columns' =>
 
                   [
 
                    'date'        => 'NOW()', 
 
                    ]
 
                 ]) ;
 
            }
 
 
        $buffer -> Flush ( ) ;
 
        }
 
 
    // BufferedLoads -
 
    //    Insert $row_count rows into the specified table using buffered LOAD DATA INFILE statements.
 
    function  BufferedLoads ( $dblink, $table_name, $row_count, $buffer_size )
 
       {
 
        mysqli_query ( $dblink, "TRUNCATE TABLE $table_name" ) ;        // Make sure we start from a clean state
 
        $buffer        =  new DbBufferedLoadFile ( $table_name, [ 'intvalue', 'randvalue', 'strvalue1', 'strvalue2', 'strvalue3' ], $buffer_size, $dblink ) ;
 
 
        for  ( $i = 1 ; $i  <=  $row_count ; $i ++ )
 
           {
 
            $strvalue    =  sha1 ( microtime ( true ) ) ;        // Well, we have to fill columns with some data...
 
            $intvalue    =  mt_rand ( ) ;
 
            $buffer -> Add 
 
               ([ 
 
                'columns' =>
 
                   [
 
                    'randvalue'    => $intvalue, 
 
                    'intvalue'    => $i,
 
                    'strvalue1'    => $strvalue, 
 
                    'strvalue2'    => $strvalue, 
 
                    'strvalue3'    => $strvalue 
 
                    ]
 
                 ]) ;
 
            }
 
 
        $buffer -> Flush ( ) ;
 
        }
 
 
 |