MySQL索引簡單分析_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%’ :顯示
- MSSQL清空日志刪除日志文件
- 關于數據庫中保留小數位的問題
- 解析mysql與Oracle update的區別
- mysql 導入導出數據庫以及函數、存儲過程的介紹
- MySQL——修改root密碼的4種方法(以windows為例)
- 解決MYSQL出現Can''t create/write to file ''#sql_5c0_0.MYD''的問題
- 深入理解SQL的四種連接-左外連接、右外連接、內連接、全連接
- 解析:內聯,左外聯,右外聯,全連接,交叉連接的區別
- mysql出現“Incorrect key file for table”處理方法
- mysql重裝后出現亂碼設置為utf8可解決
- 淺析一個MYSQL語法(在查詢中使用count)的兼容性問題
- 解析MySQL中INSERT INTO SELECT的使用
- 相關鏈接:
- 教程說明:
MySQL教程-MySQL索引簡單分析。