Make WordPress Core

Ticket #24044: wp_options_test_index_options.php

File wp_options_test_index_options.php, 5.0 KB (added by jrchamp, 10 years ago)

Updated version of dan_test.php with alternate index options

Line 
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
46foreach ($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}