mysql索引的好處:如果正確設計並使用索引,mysql會是一輛跑車,不用索引的mysql就是一輛三輪車。對於沒有索引的表,單錶查詢,可能十幾萬資料就是瓶頸,而大型**每天可能產生幾十萬甚至上百萬資料,沒有索引查詢會變的很慢。
索引是一種特殊的檔案(innodb資料表上的索引是表空間的一部分),索引包含這對資料表裡所有記錄的引用指標。更通俗地說,所以好比是一本書前面的目錄,能加快資料庫的查詢速度。
索引分為聚簇索引和非聚簇索引。聚簇索引是按照資料存放的物理位置為順序的,而非聚簇索引則不是。所以聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索快。innodb支援聚簇索引,而myisam不支援。
索引是在儲存引擎層實現的,而不是伺服器層實現的,所以不是所有的儲存引擎都支援所有的索引型別。
myisam和innodb預設的索引是btree索引
例子:create table people (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gender enum(『m』, 『f』) not null,
key(last_name, first_name, dob)
);索引中的值按索引列中的順序排列。b-tree索引可進行全字查詢、關鍵字範圍查詢、關鍵字字首查詢。
(1)匹配全值:對索引中的所有的列都指定具體的值。如查詢1960-01-01出生的cuba allen.
(2)匹配最左字首:查詢last_name為allen的人
(3)匹配列字首:查詢last_name以j看頭的人
(4)匹配值的範圍:查詢last_name在allen和barry之間的人。
(5)部分精確匹配,部分範圍查詢:查詢last_name為allen, 而fist_name以k開頭的人。
索引的列不允許重複,但允許有空值(這與主鍵不同),如果是組合索引,那麼列值的組合必須唯一。
fulltext索引僅可用於myisam引擎,但對於大容量的資料庫表,生成全文索引是非常耗費時間和空間的。
多個單列索引和單個多列索引的查詢效果不同。因為執行查詢時,mysql只能使用乙個索引。
例如:存在組合索引 index_t1(c1, c2),那麼對於查詢語句:
select * from t1 where c1=1 and c2=2;
能使用該索引,對於查詢語句:
select * from t1 where c1=1;
也能夠使用該索引,但對於查詢語句:
select * from t1 where c2=2;
則不能使用該索引。因為沒有組合索引的引導列c1.
1)越小的資料型別越好,因為越小的資料型別在磁碟、記憶體、cpu快取中都處理更快。
2)越簡單的資料型別越好,如整型好於字元型;用時間戳而不是字串來儲存時間;用整型儲存ip位址。
3)盡量避免null. 在mysql中,含有null的類很難查詢優化,因為他們使得索引的執行更複雜。可使用0或者乙個特殊的值或空字串代替null.
利用索引進行排序非常快,如order by, group by. 若其作用的列是索引,則會非常快。如果其作用的列不是索引,mysql會利用自己的快速排序演算法在記憶體(sort buffer)總對資料進行排序,如果記憶體裝載不下,它會將磁碟上的資料進行分塊,再對各個資料塊進行排序,然後將各個塊合併成有序的結果集(實際上就是外排序)。
優點:1)支援事務
2)提供了行級鎖、外來鍵約束
3)設計目標是處理大容量的資料庫
4)支援故障恢復
缺點:1)不支援fulltext索引
2)沒有儲存表的行數,select count(*) from table時,會掃瞄全表。
優點:1)支援fulltext索引
2)儲存了表的行數,select count(*) from table時,不必掃瞄全表。
缺點:1)不支援事務
2)不支援行鎖和外來鍵約束,因此insert, update時,要鎖定整張表,效率會低。
3)無法故障恢復
mysql預設的儲存引擎為innodb, 當處理資料量大時,要用innodb, 因為他支援事務,且可災難恢復。僅當資料量小,且讀操作遠大於寫操作,且不要求事務時,可考慮myisam.
mysql預設都開啟了查詢快取,即查詢結果對於下次查詢時可復用,不用再次查詢。
但有些函式預設關閉查詢快取,如:curdate(), now(), rand()等
例如:select username from user where maytime <= curtime(); // 關閉查詢快取
類似的函式都不會開啟查詢快取,所以要使用乙個變數來替代函式。如:
t od
ay=d
ate(
「y−m
−d」)
;sel
ectu
sern
amef
romu
serw
here
mayt
im
e>=『
today=date(「y-m-d」); select username from user where maytime >= 『
today=
date
(「y−
m−d」
);se
lect
user
name
from
user
wher
emay
time
>=『
today』;
explain可以知道mysql是如何執行sql的,索引是如何被使用的,資料庫表是如果排序的…
例如:查詢是否有中國的使用者:
select * from user where country = 『china』;
可以寫出:
select * from user where country = 『china』 limit 1;
在使用limit 1後,在查到一條後,會停止查詢。
例如:select name from a left join b on (a.state = b.state) where a.userid=『abc』;
這裡,a.state和b.state的型別最好相同,且這兩個列最好都建立索引。
例如:隨機挑選一條記錄:
select username from user order by rand() limit 1; // 不要這樣做。
這樣做的話,mysql會先執行rand()函式,這很耗費cpu時間,然後再為每行記錄排序,即使limit 1 也無濟於事。
推薦這樣寫:即通過查詢max(id) * rand()來隨機獲取資料:
select * from user where userid >= (
(select max(userid) from user) - (select min(userid) from user))
) * rand() limit 1;
Mysql學習筆記二
接著上面繼續學習,下面主要是以索引為主。建立索引 有四種型別的索引 主鍵 唯一索引 全文索引和普通索引 它是值惟一並且沒有值為null的域的索引。如 create table tablename filename columntype not null,filedname2.primary key ...
mysql學習筆記(二)
在具體應用中,需要實現在乙個查詢語句中顯示多張表的資料,這就是所謂的多表資料連線查詢,簡稱連線查詢。1.並 把具有相同字段數目和字段型別的表合併到一起。2.笛卡爾積 這個比較難懂,還是直接上圖 3.內連線 inner join 為了便於使用者操作,mysql專門提供了一種針對資料庫操作的運算 連線。...
Mysql學習筆記(二)
上次學習了mysql安裝,登入和退出等基本操作,以及建立,修改,刪除資料庫的基本指令重點注意mysql基本的語法規範。這篇博文主要介紹mysql幾種資料型別,以及資料表的基本內容。mysql主要有有下面幾種資料型別,包括整型,浮點型,字串型以及日期時間型。具體內容如下表所示 整型資料型別 儲存範圍 ...