索引是幫助MySQL高效獲取數據的數據結構,至關於書籍的目錄。目前Mysql的MyISAM和InnoDB都支持B-Tree索引,InnoDB還支持B+Tree索引,Memory還支持Hash。如今互聯網應用中對數據庫的使用多數都是讀較多,比例能夠達到 10:1
。而且數據庫在作查詢時 IO
消耗較大,因此若是能把一次查詢的 IO
次數控制在常量級那對數據庫的性能提高將是很是明顯的,所以基於 B+ Tree
的索引結構出現了。mysql
B+ Tree
的數據結構。是由一個一個的磁盤塊組成的樹形結構,每一個磁盤塊由數據項和指針組成。git
全部的數據都是存放在葉子節點,非葉子節點不存放數據。github
以磁盤塊1爲例,指針 P1 表示小於17的磁盤塊,P2 表示在 17~35
之間的磁盤塊,P3 則表示大於35的磁盤塊。sql
好比要查找數據項99,首先將磁盤塊1 load 到內存中,發生 1 次 IO
。接着經過二分查找發現 99 大於 35,因此找到了 P3 指針。經過P3 指針發生第二次 IO 將磁盤塊4加載到內存。再經過二分查找發現大於87,經過 P3 指針發生了第三次 IO 將磁盤塊11 加載到內存。最後再經過一次二分查找找到了數據項99。數據庫
因而可知,若是一個幾百萬的數據查詢只須要進行三次 IO 便可找到數據,那麼整個效率將是很是高的。數據結構
觀察樹的結構,發現查詢須要經歷幾回 IO 是由樹的高度來決定的,而樹的高度又由磁盤塊,數據項的大小決定的。工具
磁盤塊越大,數據項越小那麼樹的高度就越低。這也就是爲何索引字段要儘量小的緣由。性能
select name from user where id not in (1,3,4);
應該修改成:優化
select name from user where id in (2,5,6);
如:ui
select name from user where name like '%zhangsan'
非前導則能夠:
select name from user where name like 'zhangsan%'
建議能夠考慮使用 Lucene
等全文索引工具來代替頻繁的模糊查詢。
如 user 表中的性別字段,能夠明顯區分的才建議建立索引,如身份證等字段。
這樣會帶來和預期不一致的查詢結果。
select name from user where FROM_UNIXTIME(create_time) < CURDATE();
應該修改成:
select name from user where create_time < FROM_UNIXTIME(CURDATE());
若是給 user 表中的 username pwd 字段建立了複合索引那麼使用如下SQL 都是能夠命中索引:
select username from user where username='zhangsan' and pwd ='axsedf1sd' select username from user where pwd ='axsedf1sd' and username='zhangsan' select username from user where username='zhangsan'
可是使用
select username from user where pwd ='axsedf1sd'
是不能命中索引的。
select name from user where username='zhangsan' limit 1
能夠提升效率,可讓數據庫中止遊標移動。
select name from user where telno=18722222222
這樣雖然能夠查出數據,可是會致使全表掃描。
須要修改成
select name from user where telno='18722222222'
否則也不會命中索引。
yum install -y mysql-server chkconfig mysqld on service mysqld start mysql -u root set password for root@localhost=password('root'); mysql -uroot -proot
1.進入mysql數據庫:
mysql> use mysql;Database changed
2.給root用戶設置新密碼,藍色部分本身輸入:
mysql> update user set password=password("123456") where user="root";
Query OK, 1 rows affected (0.04 sec)Rows matched: 1 Changed: 1 Warnings: 0
3.刷新數據庫
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
4.退出mysql
mysql> quit
Bye