| 1 | <?php |
|---|
| 2 | |
|---|
| 3 | $link = new mysqli( 'localhost', 'root', '', 'test' ); |
|---|
| 4 | |
|---|
| 5 | $engines = array( |
|---|
| 6 | 'MyISAM', |
|---|
| 7 | 'InnoDB', |
|---|
| 8 | ); |
|---|
| 9 | |
|---|
| 10 | $table_sizes = array( 300, 3000, 30000, 300000 ); |
|---|
| 11 | |
|---|
| 12 | $percentages = array( 80, 50, 20, 5 ); |
|---|
| 13 | |
|---|
| 14 | $schemas = array( |
|---|
| 15 | 'VARCHAR20' => array( |
|---|
| 16 | 'def' => "option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, option_name VARCHAR(191) DEFAULT NULL, option_value LONGTEXT NOT NULL, autoload VARCHAR(20) NOT NULL DEFAULT 'yes', PRIMARY KEY (option_id), UNIQUE KEY option_name (option_name)", |
|---|
| 17 | 'values' => array("'no'", "'yes'"), |
|---|
| 18 | ), |
|---|
| 19 | 'VARCHAR20_idx' => array( |
|---|
| 20 | 'def' => "option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, option_name VARCHAR(191) DEFAULT NULL, option_value LONGTEXT NOT NULL, autoload VARCHAR(20) NOT NULL DEFAULT 'yes', PRIMARY KEY (option_id), UNIQUE KEY option_name (option_name), INDEX autoload_index (autoload)", |
|---|
| 21 | 'values' => array("'no'", "'yes'"), |
|---|
| 22 | ), |
|---|
| 23 | 'ENUM_idx' => array( |
|---|
| 24 | 'def' => "option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, option_name VARCHAR(191) DEFAULT NULL, option_value LONGTEXT NOT NULL, autoload ENUM('yes', 'no') NOT NULL DEFAULT 'yes', PRIMARY KEY (option_id), UNIQUE KEY option_name (option_name), INDEX autoload_index (autoload)", |
|---|
| 25 | 'values' => array("'no'", "'yes'"), |
|---|
| 26 | ), |
|---|
| 27 | 'CHAR1_idx' => array( |
|---|
| 28 | 'def' => "option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, option_name VARCHAR(191) DEFAULT NULL, option_value LONGTEXT NOT NULL, autoload CHAR(1) NOT NULL DEFAULT 'y', PRIMARY KEY (option_id), UNIQUE KEY option_name (option_name), INDEX autoload_index (autoload)", |
|---|
| 29 | 'values' => array("'n'", "'y'"), |
|---|
| 30 | ), |
|---|
| 31 | 'TINYINT_idx' => array( |
|---|
| 32 | 'def' => "option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, option_name VARCHAR(191) DEFAULT NULL, option_value LONGTEXT NOT NULL, autoload TINYINT(1) NOT NULL DEFAULT 0, PRIMARY KEY (option_id), UNIQUE KEY option_name (option_name), INDEX autoload_index (autoload)", |
|---|
| 33 | 'values' => array("0", "1"), |
|---|
| 34 | ), |
|---|
| 35 | 'VARCHAR20_idx2' => array( |
|---|
| 36 | 'def' => "option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, option_name VARCHAR(191) DEFAULT NULL, option_value LONGTEXT NOT NULL, autoload VARCHAR(20) NOT NULL DEFAULT 'yes', PRIMARY KEY (option_id), UNIQUE KEY option_name (option_name), INDEX autoload_index (autoload, option_name)", |
|---|
| 37 | 'values' => array("'no'", "'yes'"), |
|---|
| 38 | ), |
|---|
| 39 | ); |
|---|
| 40 | |
|---|
| 41 | $b = str_repeat( 'x', 1000 ); |
|---|
| 42 | |
|---|
| 43 | $run_prep_data = FALSE; |
|---|
| 44 | $run_tests = TRUE; |
|---|
| 45 | |
|---|
| 46 | foreach ($engines as $key => $engine) { |
|---|
| 47 | foreach ($table_sizes as $key => $table_size) { |
|---|
| 48 | foreach ($percentages as $key => $percentage) { |
|---|
| 49 | $last_avg = FALSE; |
|---|
| 50 | echo "{$engine} - Size {$table_size} - Percent {$percentage}\n"; |
|---|
| 51 | foreach ($schemas as $schema_name => $schema) { |
|---|
| 52 | $schema_val = $schema['values']; |
|---|
| 53 | $table_name = "{$engine}_{$schema_name}_Size_{$table_size}_Percent_{$percentage}"; |
|---|
| 54 | |
|---|
| 55 | if ($run_prep_data == TRUE) { |
|---|
| 56 | // Creates |
|---|
| 57 | $setup_sql = "DROP TABLE IF EXISTS {$table_name}; "; |
|---|
| 58 | $link->query($setup_sql) or die(__LINE__ . ': ' . $link->error . PHP_EOL); |
|---|
| 59 | $setup_sql = "CREATE TABLE ${table_name} ({$schema['def']}) ENGINE={$engine} DEFAULT CHARSET=utf8mb4;"; |
|---|
| 60 | $link->query($setup_sql) or die(__LINE__ . ': ' . $link->error . PHP_EOL); |
|---|
| 61 | |
|---|
| 62 | // Fills |
|---|
| 63 | $sql = "INSERT INTO {$table_name} (option_name, option_value, autoload) VALUES "; |
|---|
| 64 | $batch = 0; |
|---|
| 65 | $rows = array(); |
|---|
| 66 | for ($row = 0; $row < $table_size; $row++) { |
|---|
| 67 | if ($batch == 100) { |
|---|
| 68 | $link->query($sql . implode(', ', $rows)) or die(__LINE__ . ': ' . $link->error . PHP_EOL); |
|---|
| 69 | $batch = 0; |
|---|
| 70 | $rows = array(); |
|---|
| 71 | } |
|---|
| 72 | $a = "option_number_{$row}"; |
|---|
| 73 | $c = ( ( $row % 100 ) < $percentage ) ? $schema_val[1] : $schema_val[0]; |
|---|
| 74 | $rows[] = "('{$a}', '{$b}', $c)"; |
|---|
| 75 | $batch++; |
|---|
| 76 | } |
|---|
| 77 | $link->query($sql . implode(', ', $rows)) or die(__LINE__ . ': ' . $link->error . PHP_EOL); |
|---|
| 78 | $rows = array(); |
|---|
| 79 | } |
|---|
| 80 | |
|---|
| 81 | if ($run_tests == TRUE) { |
|---|
| 82 | $i = 1; // We only really are concerned with checking c=yes as in the application we only have that query. |
|---|
| 83 | $select_val = $schema_val[$i]; |
|---|
| 84 | $time_taken = array(); |
|---|
| 85 | for ($t = 0; $t < 10; $t++) { |
|---|
| 86 | $sql = "SELECT option_name, option_value FROM {$table_name} WHERE autoload = {$select_val};"; |
|---|
| 87 | |
|---|
| 88 | $start = microtime( true ); |
|---|
| 89 | $res = $link->query( $sql ); |
|---|
| 90 | $end = microtime( true ); |
|---|
| 91 | |
|---|
| 92 | if (!$res) { |
|---|
| 93 | die(__LINE__ . ': ' . $link->error . PHP_EOL); |
|---|
| 94 | } |
|---|
| 95 | |
|---|
| 96 | $res->free(); |
|---|
| 97 | if ($t > 0) { |
|---|
| 98 | $time_taken[] = ($end - $start); |
|---|
| 99 | } |
|---|
| 100 | } |
|---|
| 101 | |
|---|
| 102 | // Drop the largest and smallest |
|---|
| 103 | sort($time_taken); |
|---|
| 104 | array_shift($time_taken); |
|---|
| 105 | array_pop($time_taken); |
|---|
| 106 | |
|---|
| 107 | $avg_time = array_sum($time_taken) / count($time_taken); |
|---|
| 108 | |
|---|
| 109 | // Set the baseline |
|---|
| 110 | if ($last_avg === FALSE) { |
|---|
| 111 | $last_avg = $avg_time; |
|---|
| 112 | } |
|---|
| 113 | // If the difference is significant (more than 10 ms), print it |
|---|
| 114 | elseif (abs($last_avg - $avg_time) > 0.010) { |
|---|
| 115 | echo "{$schema_name} {$select_val} " , number_format($avg_time, 5); |
|---|
| 116 | |
|---|
| 117 | if ($last_avg < $avg_time) { |
|---|
| 118 | echo " << Slower "; |
|---|
| 119 | } |
|---|
| 120 | else { |
|---|
| 121 | echo " >> Faster "; |
|---|
| 122 | } |
|---|
| 123 | echo number_format(100 * $last_avg / $avg_time, 0) , "%\n"; |
|---|
| 124 | } |
|---|
| 125 | } |
|---|
| 126 | } |
|---|
| 127 | echo "\n"; |
|---|
| 128 | } |
|---|
| 129 | } |
|---|
| 130 | } |
|---|