00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 if (!defined('ADODB_DIR')) die();
00017
00018 class perf_mysql extends adodb_perf{
00019
00020 var $tablesSQL = 'show table status';
00021
00022 var $createTableSQL = "CREATE TABLE adodb_logsql (
00023 created datetime NOT NULL,
00024 sql0 varchar(250) NOT NULL,
00025 sql1 text NOT NULL,
00026 params text NOT NULL,
00027 tracer text NOT NULL,
00028 timer decimal(16,6) NOT NULL
00029 )";
00030
00031 var $settings = array(
00032 'Ratios',
00033 'MyISAM cache hit ratio' => array('RATIO',
00034 '=GetKeyHitRatio',
00035 '=WarnCacheRatio'),
00036 'InnoDB cache hit ratio' => array('RATIO',
00037 '=GetInnoDBHitRatio',
00038 '=WarnCacheRatio'),
00039 'data cache hit ratio' => array('HIDE', # only if called
00040 '=FindDBHitRatio',
00041 '=WarnCacheRatio'),
00042 'sql cache hit ratio' => array('RATIO',
00043 '=GetQHitRatio',
00044 ''),
00045 'IO',
00046 'data reads' => array('IO',
00047 '=GetReads',
00048 'Number of selects (Key_reads is not accurate)'),
00049 'data writes' => array('IO',
00050 '=GetWrites',
00051 'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'),
00052
00053 'Data Cache',
00054 'MyISAM data cache size' => array('DATAC',
00055 array("show variables", 'key_buffer_size'),
00056 '' ),
00057 'BDB data cache size' => array('DATAC',
00058 array("show variables", 'bdb_cache_size'),
00059 '' ),
00060 'InnoDB data cache size' => array('DATAC',
00061 array("show variables", 'innodb_buffer_pool_size'),
00062 '' ),
00063 'Memory Usage',
00064 'read buffer size' => array('CACHE',
00065 array("show variables", 'read_buffer_size'),
00066 '(per session)'),
00067 'sort buffer size' => array('CACHE',
00068 array("show variables", 'sort_buffer_size'),
00069 'Size of sort buffer (per session)' ),
00070 'table cache' => array('CACHE',
00071 array("show variables", 'table_cache'),
00072 'Number of tables to keep open'),
00073 'Connections',
00074 'current connections' => array('SESS',
00075 array('show status','Threads_connected'),
00076 ''),
00077 'max connections' => array( 'SESS',
00078 array("show variables",'max_connections'),
00079 ''),
00080
00081 false
00082 );
00083
00084 function perf_mysql(&$conn)
00085 {
00086 $this->conn =& $conn;
00087 }
00088
00089 function Explain($sql,$partial=false)
00090 {
00091
00092 if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '<p>Unable to EXPLAIN non-select statement</p>';
00093 $save = $this->conn->LogSQL(false);
00094 if ($partial) {
00095 $sqlq = $this->conn->qstr($sql.'%');
00096 $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
00097 if ($arr) {
00098 foreach($arr as $row) {
00099 $sql = reset($row);
00100 if (crc32($sql) == $partial) break;
00101 }
00102 }
00103 }
00104 $sql = str_replace('?',"''",$sql);
00105
00106 if ($partial) {
00107 $sqlq = $this->conn->qstr($sql.'%');
00108 $sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq");
00109 }
00110
00111 $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
00112 $rs = $this->conn->Execute('EXPLAIN '.$sql);
00113 $s .= rs2html($rs,false,false,false,false);
00114 $this->conn->LogSQL($save);
00115 $s .= $this->Tracer($sql);
00116 return $s;
00117 }
00118
00119 function Tables()
00120 {
00121 if (!$this->tablesSQL) return false;
00122
00123 $rs = $this->conn->Execute($this->tablesSQL);
00124 if (!$rs) return false;
00125
00126 $html = rs2html($rs,false,false,false,false);
00127 return $html;
00128 }
00129
00130 function GetReads()
00131 {
00132 global $ADODB_FETCH_MODE;
00133 $save = $ADODB_FETCH_MODE;
00134 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00135 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
00136
00137 $rs = $this->conn->Execute('show status');
00138
00139 if (isset($savem)) $this->conn->SetFetchMode($savem);
00140 $ADODB_FETCH_MODE = $save;
00141
00142 if (!$rs) return 0;
00143 $val = 0;
00144 while (!$rs->EOF) {
00145 switch($rs->fields[0]) {
00146 case 'Com_select':
00147 $val = $rs->fields[1];
00148 $rs->Close();
00149 return $val;
00150 }
00151 $rs->MoveNext();
00152 }
00153
00154 $rs->Close();
00155
00156 return $val;
00157 }
00158
00159 function GetWrites()
00160 {
00161 global $ADODB_FETCH_MODE;
00162 $save = $ADODB_FETCH_MODE;
00163 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00164 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
00165
00166 $rs = $this->conn->Execute('show status');
00167
00168 if (isset($savem)) $this->conn->SetFetchMode($savem);
00169 $ADODB_FETCH_MODE = $save;
00170
00171 if (!$rs) return 0;
00172 $val = 0.0;
00173 while (!$rs->EOF) {
00174 switch($rs->fields[0]) {
00175 case 'Com_insert':
00176 $val += $rs->fields[1]; break;
00177 case 'Com_delete':
00178 $val += $rs->fields[1]; break;
00179 case 'Com_update':
00180 $val += $rs->fields[1]/2;
00181 $rs->Close();
00182 return $val;
00183 }
00184 $rs->MoveNext();
00185 }
00186
00187 $rs->Close();
00188
00189 return $val;
00190 }
00191
00192 function FindDBHitRatio()
00193 {
00194
00195
00196
00197 global $ADODB_FETCH_MODE;
00198 $save = $ADODB_FETCH_MODE;
00199 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00200 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
00201
00202 $rs = $this->conn->Execute('show table status');
00203
00204 if (isset($savem)) $this->conn->SetFetchMode($savem);
00205 $ADODB_FETCH_MODE = $save;
00206
00207 if (!$rs) return '';
00208 $type = strtoupper($rs->fields[1]);
00209 $rs->Close();
00210 switch($type){
00211 case 'MYISAM':
00212 case 'ISAM':
00213 return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)';
00214 case 'INNODB':
00215 return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)';
00216 default:
00217 return $type.' not supported';
00218 }
00219
00220 }
00221
00222 function GetQHitRatio()
00223 {
00224
00225 $hits = $this->_DBParameter(array("show status","Qcache_hits"));
00226 $total = $this->_DBParameter(array("show status","Qcache_inserts"));
00227 $total += $this->_DBParameter(array("show status","Qcache_not_cached"));
00228
00229 $total += $hits;
00230 if ($total) return round(($hits*100)/$total,2);
00231 return 0;
00232 }
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246 function GetInnoDBHitRatio()
00247 {
00248 global $ADODB_FETCH_MODE;
00249
00250 $save = $ADODB_FETCH_MODE;
00251 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00252 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
00253
00254 $rs = $this->conn->Execute('show innodb status');
00255
00256 if (isset($savem)) $this->conn->SetFetchMode($savem);
00257 $ADODB_FETCH_MODE = $save;
00258
00259 if (!$rs || $rs->EOF) return 0;
00260 $stat = $rs->fields[0];
00261 $rs->Close();
00262 $at = strpos($stat,'Buffer pool hit rate');
00263 $stat = substr($stat,$at,200);
00264 if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) {
00265 $val = 100*$arr[1]/$arr[2];
00266 $_SESSION['INNODB_HIT_PCT'] = $val;
00267 return round($val,2);
00268 } else {
00269 if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT'];
00270 return 0;
00271 }
00272 return 0;
00273 }
00274
00275 function GetKeyHitRatio()
00276 {
00277 $hits = $this->_DBParameter(array("show status","Key_read_requests"));
00278 $reqs = $this->_DBParameter(array("show status","Key_reads"));
00279 if ($reqs == 0) return 0;
00280
00281 return round(($hits/($reqs+$hits))*100,2);
00282 }
00283
00284
00285 var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK';
00286 var $optimizeTableHigh = 'OPTIMIZE TABLE %s';
00287
00291 function optimizeTable( $table, $mode = ADODB_OPT_LOW)
00292 {
00293 if ( !is_string( $table)) return false;
00294
00295 $conn = $this->conn;
00296 if ( !$conn) return false;
00297
00298 $sql = '';
00299 switch( $mode) {
00300 case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break;
00301 case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break;
00302 default :
00303 {
00304
00305 ADOConnection::outp( sprintf( "<p>%s: '%s' using of undefined mode '%s'</p>", __CLASS__, __FUNCTION__, $mode));
00306 return false;
00307 }
00308 }
00309 $sql = sprintf( $sql, $table);
00310
00311 return $conn->Execute( $sql) !== false;
00312 }
00313
00314 }
00315 ?>