MySQL1索引

1、Mysql索引原理

  索引是幫助MySQL高效獲取數據的數據結構,至關於書籍的目錄。目前Mysql的MyISAM和InnoDB都支持B-Tree索引,InnoDB還支持B+Tree索引,Memory還支持Hash。如今互聯網應用中對數據庫的使用多數都是讀較多,比例能夠達到 10:1。而且數據庫在作查詢時 IO 消耗較大,因此若是能把一次查詢的 IO 次數控制在常量級那對數據庫的性能提高將是很是明顯的,所以基於 B+ Tree 的索引結構出現了。mysql

  B+ Tree 的數據結構

  

  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 是由樹的高度來決定的,而樹的高度又由磁盤塊,數據項的大小決定的。工具

磁盤塊越大,數據項越小那麼樹的高度就越低。這也就是爲何索引字段要儘量小的緣由。性能

2、索引優化

負向查詢不能使用索引

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 表中的性別字段,能夠明顯區分的才建議建立索引,如身份證等字段。

字段的默認值不要爲 null

這樣會帶來和預期不一致的查詢結果。

在字段上進行計算不能命中索引

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'

若是須要進行 join 的字段兩表的字段類型要相同

否則也不會命中索引。

3、Mysql安裝

3.1 用最簡單的方式裝一個mysql數據庫

yum install -y mysql-server

chkconfig mysqld on
 
service mysqld start

mysql -u root

set password for root@localhost=password('root');

mysql -uroot -proot

3.2 mysql 鏈接問題報1045錯誤

  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
相關文章
相關標籤/搜索