MySQL學習筆記二

2021-09-12 23:46:57 字數 3465 閱讀 4872

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主要有有下面幾種資料型別,包括整型,浮點型,字串型以及日期時間型。具體內容如下表所示 整型資料型別 儲存範圍 ...