暫時(shí)還沒看
講解的很透徹
- mysql語句中----刪除表數(shù)據(jù)drop恼布、truncate和delete的用法
程度從強(qiáng)到弱
1尿招、drop table tb
drop將表格直接刪除杭攻,沒有辦法找回
2、truncate (table) tb
刪除表中的所有數(shù)據(jù),不能與where一起使用
3医增、delete from tb (where)
刪除表中的數(shù)據(jù)(可制定某一行)
區(qū)別:truncate和delete的區(qū)別
1谆构、事務(wù):truncate是不可以rollback的,但是delete是可以rollback的铡买;
原因:truncate刪除整表數(shù)據(jù)(ddl語句,隱式提交)更鲁,delete是一行一行的刪除,可以rollback
2奇钞、效果:truncate刪除后將重新水平線和索引(id從零開始) ,delete不會(huì)刪除索引
3澡为、 truncate 不能觸發(fā)任何Delete觸發(fā)器。
4景埃、delete 刪除可以返回行數(shù)
執(zhí)行sql腳本文件
-
方法一 使用cmd命令執(zhí)行(windows下媒至,unix或linux在的其控制臺(tái)下)
【Mysql的bin目錄】\mysql –u用戶名 –p密碼 –D數(shù)據(jù)庫<【sql腳本文件路徑全名】,示例:
D:\mysql\bin\mysql –uroot –p123456 -Dtest<d:\test\ss.sql
注意:
A谷徙、如果在sql腳本文件中使用了use 數(shù)據(jù)庫拒啰,則-D數(shù)據(jù)庫選項(xiàng)可以忽略
B、如果【Mysql的bin目錄】中包含空格完慧,則需要使用“”包含谋旦,如:“C:\Program Files\mysql\bin\mysql” –u用戶名 –p密碼 –D數(shù)據(jù)庫<【sql腳本文件路徑全名】 方法二 進(jìn)入mysql的控制臺(tái)后,使用source命令執(zhí)行
Mysql>source 【sql腳本文件的路徑全名
事物
InnoDb 事物: begin和commit之間的操作
begin: 事物的開始
commit: 事物提交
rollback: 當(dāng)begin之后 , 還沒有commit , rollback 會(huì)返回begin之前的狀態(tài).
事件中斷, 當(dāng)begin之后還沒來得及commit, 就退出了MySQL環(huán)境, 會(huì)自動(dòng)回到begin之前的操作, begin之后的操作被拋棄
- 一致性,
select
只會(huì)返回最近一次事件的結(jié)果. 即使當(dāng)前有事件發(fā)生, 也不會(huì)干擾到select
的結(jié)果(除非是在打開的事物內(nèi)進(jìn)行select
);
更新讀鎖
select * from 表名 for update
保證拿到最新事物的結(jié)果, 如果前面有沒有執(zhí)行完的事物, 會(huì)等到前面事物執(zhí)行結(jié)束之后才會(huì)返回查詢結(jié)果(保證結(jié)果最新), 針對(duì)某一個(gè)屬性;共享的讀鎖
lock in share mode
-
跟新鎖和共享鎖的區(qū)別.
更新鎖SELECT ... FOR UPDATE sets an exclusive lock on the rows read. An exclusive lock prevents other sessions from accessing the rows for reading or writing.
在讀取行上設(shè)置一個(gè)排他鎖骗随。阻止其他session讀取或者寫入行數(shù)據(jù)頂
共享鎖
>SELECT ... LOCK IN SHARE MODE sets a shared mode lock on the rows read. A shared mode lock enables other sessions to read the rows but not to modify them. The rows read are the latest available, so if they belong to another transaction that has not yet committed, the read blocks until that transaction ends.
在讀取的行上設(shè)置一個(gè)共享模式的鎖蛤织。這個(gè)共享鎖允許其它session讀取數(shù)據(jù)但不允許修改它。 行讀取的是最新的數(shù)據(jù)鸿染,如果他被其它事務(wù)使用中而沒有提交指蚜,讀取鎖將被阻塞直到那個(gè)事務(wù)結(jié)束。
其他示例:
- [深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE](http://blog.csdn.net/cug_jiang126com/article/details/50544728)
- [mysql共享鎖與排他鎖](http://www.cnblogs.com/boblogsbo/p/5602122.html)
MySQL 從入門到精通
- 建表
CREATE TABLE sales_rep
mysql> CREATE TABLE sales_rep(
-> employee_number INT,
-> surname VARCHAR(40),
-> first_name VARCHAR(30),
-> commission tinyint(1)// 一般 TINYINT(1) 當(dāng) bool 值用
-> );
Query OK, 0 rows affected (0.02 sec)
- 給表填入數(shù)據(jù) , 填入下面的值 (1,'Rive','Sol',10), (2,'Gordimer','Charlene',15), (3,'Serote','Mike',10);
mysql> INSERT INTO sales_rep(employee_number,surname,first_name,commission) VALUES
-> (1,'Rive','Sol',10),
-> (2,'Gordimer','Charlene',15),
-> (3,'Serote','Mike',10);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
-
TYPE=MyISAM
現(xiàn)在改為了ENGINE=MyISAM
- 關(guān)于規(guī)則表達(dá)式
用 iain 匹配 ianmysql> SELECT 'ian' REGEXP 'iai*n'; +----------------------+ | 'ian' REGEXP 'iai*n' | +----------------------+ | 1 | +----------------------+ 1 row in set (0.00 sec)
這里可以把 (i) 看做一個(gè)整體, * 表示前面的字符可以出現(xiàn)零次或者多次. 所有i可以出現(xiàn)零次
那么iai*n
可以為ian
, 所有可以匹配ian
執(zhí)行sql腳本文件
方法一 使用cmd命令執(zhí)行(windows下涨椒,unix或linux在的其控制臺(tái)下)
【Mysql的bin目錄】\mysql –u用戶名 –p密碼 –D數(shù)據(jù)庫<【sql腳本文件路徑全名】摊鸡,示例:
D:\mysql\bin\mysql –uroot –p123456 -Dtest<d:\test\ss.sql
注意:
A、如果在sql腳本文件中使用了use 數(shù)據(jù)庫蚕冬,則-D數(shù)據(jù)庫選項(xiàng)可以忽略
B免猾、如果【Mysql的bin目錄】中包含空格,則需要使用“”包含囤热,如:“C:\Program Files\mysql\bin\mysql” –u用戶名 –p密碼 –D數(shù)據(jù)庫<【sql腳本文件路徑全名】方法二 進(jìn)入mysql的控制臺(tái)后猎提,使用source命令執(zhí)行
Mysql>source 【sql腳本文件的路徑全名】
- <<MySQL 從入門到精通>>
- 簡(jiǎn)明教程 - 使用MySQL
感覺 SHOW ENGINE INNODB STATUS; 這個(gè)命令很強(qiáng)大啊
回滾 rallback
提交 commit
索引
索引類型: 主鍵,唯一索引,全文索引
-
主鍵: 值唯一,沒有值為NULL德域的索引
創(chuàng)建帶有主鍵的表:CREATE TABLE 表名(fieldname columtype NOT NULL, [fieldname2...] PRIMARY KEY(fieldname [,fieldname2...]));
給已經(jīng)存在的表添加主鍵:
ALTER TABLE tablename ADD PRIMARY KEY(fieldname1 [,fieldname2...]);
-
創(chuàng)建普通索引
- 創(chuàng)建表的時(shí)候,同時(shí)創(chuàng)建索引
CREATE TABLE tablename(fieldname columntype, fieldname2 columntype, INDEX [indexname] (fieldname1 [,fieldname2...]));
- 創(chuàng)建表的時(shí)候, 同時(shí)創(chuàng)建多個(gè)索引
CREATE TABLE tablename(fieldname columntype,fieldname2 columntype, INDEX [indexname1](fie_name1,fieldname2), INDEX[indexname2] (fieldname1 [,fieldname2]));
- 在創(chuàng)建表之后再創(chuàng)建索引:
// 或者 CREATE INDEX indexnamw on tablename(fieldname1 [,fieldname2...]);
-
創(chuàng)建全文索引, 針對(duì)任意的
CHAR, VARCHAR TEXT
類型的域,其他類型都不能創(chuàng)建全文索引CREATE TABLE tablename (fieldname columntype, fieldname2 columntype, FULLTEXT(fieldname [,fieldname2...])); // 或者可以加上 INDEX CREATE TABLE tablename (fieldname columntype, fieldname2 columntype, FULLTEXT INDEX(fieldname [,fieldname2...]));
- 在一個(gè)已經(jīng)存在的表中創(chuàng)建全文索引
ALTER TABLE ft ADD FULLTEXT (f1,f2);
使用全文索引
FULLTEXT()
- 使用
MATCH(域名)
AGAINST(具體值)
來返回檢索結(jié)果
SELECT * FROM ft2 WHERE MATCH(f1) AGAINST('Master');
-
噪音單詞: 某些常見的單詞在查詢的時(shí)候會(huì)被忽略
- MySQL 有一個(gè)百分之五十的門限的東西, 任何在百分之五十以上的域出現(xiàn)的單詞就會(huì)被認(rèn)為是噪音單詞, 會(huì)被查詢忽略.
- 一個(gè)單詞少于三個(gè)字符會(huì)被忽略
- 存在一個(gè)預(yù)定義的噪音單詞列表, 包括the
-
相關(guān)性:
查f1
的相關(guān)性SELECT f1, (MATCH(f1) AGAINST ('Master')) From ft2 +-----------------------------+-------------------------------+ | f1 | (match(f1) against('Master')) | +-----------------------------+-------------------------------+ | Wating for the Barbarians | 0 | | In the Heart of the Country | 0 | | The Master of Petersburg | 0.4266865849494934 | | Writing and being | 0 | | Heart of the Beast | 0 | | Heart of the Beest | 0 | | The Beginning and the End | 0 | | Master Master | 0.8533731698989868 | | A Barbarian at my Door | 0 | +-----------------------------+-------------------------------+ 9 rows in set (0.00 sec)
查 `f1` 中 值`Master` 的相關(guān)性
```
SELECT f1,(MATCH(f1) AGAINST('Master')) FROM ft2 WHERE MATCH(f1) AGAINST('Master');
+--------------------------+-------------------------------+
| f1 | (MATCH(f1) AGAINST('Master')) |
+--------------------------+-------------------------------+
| Master Master | 0.8533731698989868 |
| The Master of Petersburg | 0.4266865849494934 |
+--------------------------+-------------------------------+
2 rows in set (0.00 sec)
```
-
布爾全文查找: IN BOOLEAN MODE
利用全集特征來查找單詞,單詞組合以及單詞的部分- 后面的單詞必須出現(xiàn)
- 后面的單詞不能出現(xiàn)
< 讓后面的單詞相關(guān)性最小
讓后面的單詞相關(guān)性最大
() 在子表達(dá)式中用來分組單詞
~ 沒理解
* 放到單詞的結(jié)尾, 表示0個(gè)或多個(gè)字符
"" 包含的部分是一個(gè)整體. 是完全匹配 -
唯一索引:
不允許自己索引的內(nèi)容有重復(fù).
創(chuàng)建
CREATE TABLE tablename (fieldname columntype, fieldname2 columntype, UNIQUE(fieldname[,fieldname2...]))
在已經(jīng)存在的表上創(chuàng)建:
ALTER TABLE tablename ADD UNIQUE[indexname](fieldname[,fieldname2...]);
或者
CREATE UNIQUE INDEX indexname ON tablename(fieldname[,fieldname2...]);
如果索引只包含一個(gè)域,那這個(gè)域不能包含重復(fù)值
如果索引包含多個(gè)域,但單個(gè)域的值是可以重復(fù)的. 組成整個(gè)索引的域的組合是不能重復(fù)的.
-
創(chuàng)建自動(dòng)增加域
建表時(shí)同時(shí)創(chuàng)建自動(dòng)增加域
CREATE TABLE tablename(fieldname INT AUTO_INCREMENT,[fieldname2...]);
在已經(jīng)存在的表中創(chuàng)建自動(dòng)增加域
ALTER TABLE tablename MODIFY fieldname columntype AUTO_INCREMENT;
刪除主鍵
ALTER TABLE tablename DROP INDEX indexname;
刪除索引
ALTER TABLE tablename DROP INDEX indexname;
或者
DROP INDEX indexname ON tablename;
查看所有索引名字
SHOW KEYS tablename;
- 高效使用索引
索引非常少時(shí), 返回結(jié)果非常慢.
索引太多, 太占內(nèi)存.
-
如何使用索引
WHERE 從句中
SELECT first_name FROM customer WHERE surname>'C';
select 后面不能觸發(fā)索引 如SELECT first_name
這個(gè)frist_name 就不能觸發(fā)索引適當(dāng)域創(chuàng)建適當(dāng)?shù)乃饕? 如int列表中添加索引, 查找 MAX() 和 MIN() 就很快
當(dāng)索返回的數(shù)據(jù)是索引的一部分, 會(huì)直接觸發(fā)索引
ORDER BY
從句加速鏈接
可以在通配符下使用, 不過通配符不能匹配首字母
-
選擇索引
- 主鍵是最好的索引, 返回的行數(shù)越少越好
- 枚舉上的索引不是特別有用
- 使用短索引,
- 不要?jiǎng)?chuàng)建太多的索引
-
使用最左邊的前綴
比如一個(gè)索引的順序是INDEX(surname,initial,first_name)
凡是按照索引順序去查找的都能用到索引.
如:
//surname, initial,first_name
select * from customer where surname='Clegg' and initial='X' and first_name='Yvonne';
//surname, initial;
select * from customer where surname='Clegg' and initial='X' ;
//surname
select * from customer where surname='Clegg';
不是按照從左到右的順序不會(huì)使用索引
如:
initial,first_name
select * from customer where initial='X' and first_name='Yvonne';
first_name
select * from customer where first_name='Yvonne';
initial
select * from customer where initial='X';
下面的會(huì)部分索引
surname,first_name
select * from customer where surname='Clegg' AND first_name='Yvonne'
- 使用 EXPLAIN 分析MySQL 如何使用索引
可以使用EXPLAIN
查看索引的效率和狀態(tài), 然后提高索引效率
- 在查詢中計(jì)算
在常數(shù)上進(jìn)行計(jì)算, 不要在索引上計(jì)算
如: commission 是索引
索引上計(jì)算: commission+5<20
常數(shù)上計(jì)算: commission<20-5