MySQL索引簡單分析_MySQL教程

      編輯Tag賺U幣
      教程Tag:MySQL索引添加

      推薦:MySQL性能優化的最佳21條經驗
      今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對于Web應用尤其明顯。關于數據庫的性能,這并不只是DBA才需要擔心的事,而這更是我們程序員需要去關注的事情。當我們去設計數據庫表結構,對操作數據庫時(尤其是查表時的SQL語句),我們都需要注意數據操作的

      創建2張用戶表user、user2,表結構相同,但user表使用InnoDB存儲引擎,而user2表則使用 MyISAM存儲引擎。

      -- Table "user" DDL
       
      CREATE TABLE `user` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(50) DEFAULT NULL,
        `email` varchar(100) DEFAULT NULL,
        `age` tinyint(4) DEFAULT NULL,
        `nickname` varchar(50) DEFAULT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `email` (`email`),
        KEY `name` (`name`),
        KEY `age` (`age`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
       
      -- Table "user2" DDL
       
      CREATE TABLE `user2` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(50) DEFAULT NULL,
        `email` varchar(100) DEFAULT NULL,
        `age` tinyint(4) DEFAULT NULL,
        `nickname` varchar(50) DEFAULT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `email` (`email`),
        KEY `name` (`name`),
        KEY `age` (`age`)
      ) ENGINE=MyISAM AUTO_INCREMENT=131610 DEFAULT CHARSET=utf8;

      分別插入10W條測試數據到表user & user2。

      <?php
       
      $example = array(
          '@qq.com', 
          '@sina.com.cn', 
          '@163.com',
          '@126.com',
          '@gmail.com',
          '@yahoo.com',
          '@live.com',
          '@msn.com',
          '@cisco.com',
          '@microsoft.com',
          '@ibm.com',
          '@apple.com');
       
      $con = mysql_connect("localhost", "root", "your_mysql_password");
       
      mysql_select_db("index_test", $con);
       
      //添加10W測試數據到表 user & user2
      for($i=0; $i<100000; $i++)
      {
          $temp = md5(uniqid());
       
          $name = substr($temp, 0, 16);
          $email = substr($temp, 8, 12).$example[array_rand($example, 1)];
          $age = rand(18, 99);
          $nickname = substr($temp, 16, 16);    
       
          mysql_query("INSERT INTO user(name,email,age,nickname) VALUES('$name','$email',$age,'$nickname')");
          mysql_query("INSERT INTO user2(name,email,age,nickname) VALUES('$name','$email',$age,'$nickname')");
      }
       
      mysql_close($con);
        
      echo 'success';
       
      ?>

      對索引的使用分析

      Explain Select * from user where id>100 \G;

      圖1

      Explain Select * from user2 where id>100 \G;

      圖2

      User 表中的數據和 User2 表中的數據是一樣的,索引結構也是一樣的,只不過它們的存儲引擎不同。在圖1中,查詢用到了PRIMARY主鍵索引,而查詢優化器預估的結果大概在65954行左右(實際是131513);在圖2中,查詢卻沒有使用索引,而是全表掃描了,返回的預估結果在131608行(實際是131509)。

      Explain Select * from user where id>100 and age>50 \G;

      圖3

      Explain Select * from user where id>100 and age=50 \G;

      圖4

      Explain Select * from user2 where id>100 and age>50 \G;

      圖5

      Explain Select * from user2 where id>100 and age=50 \G;

      圖6

      分享:MySql優化指南
      MySql優化的一般步驟: 1.通過show status 命令了解各種sql的執行效率 SHOW STATUS提供msyql服務器的狀態信息 一般情況下,我們只需要了解以”Com”開頭的指令 show session status like ‘Com%’:顯示當前的連接的統計結果 show global status like ‘Com%’ :顯示

      來源:未知//所屬分類:MySQL教程/更新時間:2012-10-26
      相關MySQL教程