MySQL 从入门到精通 部分笔记

暂时还没看

讲解的很透彻

  • mysql语句中----删除表数据drop、truncate和delete的用法
    程度从强到弱
    1、drop table tb
    drop将表格直接删除,没有办法找回
    2、truncate (table) tb
    删除表中的所有数据,不能与where一起使用
    3、delete from tb (where)
    删除表中的数据(可制定某一行)
    区别:truncate和delete的区别
    1、事务:truncate是不可以rollback的,但是delete是可以rollback的;
    原因:truncate删除整表数据(ddl语句,隐式提交),delete是一行一行的删除,可以rollback
    2、效果:truncate删除后将重新水平线和索引(id从零开始) ,delete不会删除索引
    3、 truncate 不能触发任何Delete触发器。
    4、delete 删除可以返回行数
  • 执行sql脚本文件

  • 方法一 使用cmd命令执行(windows下,unix或linux在的其控制台下)
    【Mysql的bin目录】\mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】,示例:
    D:\mysql\bin\mysql –uroot –p123456 -Dtest<d:\test\ss.sql

    注意:
    A、如果在sql脚本文件中使用了use 数据库,则-D数据库选项可以忽略
    B、如果【Mysql的bin目录】中包含空格,则需要使用“”包含,如:“C:\Program Files\mysql\bin\mysql” –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】

  • 方法二 进入mysql的控制台后,使用source命令执行
    Mysql>source 【sql脚本文件的路径全名

事物

InnoDb 事物: begin和commit之间的操作
begin: 事物的开始
commit: 事物提交
rollback: 当begin之后 , 还没有commit , rollback 会返回begin之前的状态.

事件中断, 当begin之后还没来得及commit, 就退出了MySQL环境, 会自动回到begin之前的操作, begin之后的操作被抛弃

  • 一致性, select 只会返回最近一次事件的结果. 即使当前有事件发生, 也不会干扰到 select的结果(除非是在打开的事物内进行select);
  • 更新读锁 select * from 表名 for update
    保证拿到最新事物的结果, 如果前面有没有执行完的事物, 会等到前面事物执行结束之后才会返回查询结果(保证结果最新), 针对某一个属性;

  • 共享的读锁lock in share mode

  • 跟新锁和共享锁的区别.
    更新锁

    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.

    在读取行上设置一个排他锁。阻止其他session读取或者写入行数据顶

共享锁
 >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. 

在读取的行上设置一个共享模式的锁。这个共享锁允许其它session读取数据但不允许修改它。 行读取的是最新的数据,如果他被其它事务使用中而没有提交,读取锁将被阻塞直到那个事务结束。 

其他示例:
- [深入理解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) 当 bool 值用
    -> );
Query OK, 0 rows affected (0.02 sec)

  • 给表填入数据 , 填入下面的值 (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 现在改为了 ENGINE=MyISAM
  • 关于规则表达式
    mysql> SELECT 'ian' REGEXP 'iai*n';
    +----------------------+
    | 'ian' REGEXP 'iai*n' |
    +----------------------+
    |                    1 |
    +----------------------+
    1 row in set (0.00 sec)
    
    用 iain 匹配 ian
    这里可以把 (i
    ) 看做一个整体, * 表示前面的字符可以出现零次或者多次. 所有i可以出现零次
    那么 iai*n 可以为 ian, 所有可以匹配ian
  • 执行sql脚本文件

  • 方法一 使用cmd命令执行(windows下,unix或linux在的其控制台下)
    【Mysql的bin目录】\mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】,示例:
    D:\mysql\bin\mysql –uroot –p123456 -Dtest<d:\test\ss.sql
    注意:
    A、如果在sql脚本文件中使用了use 数据库,则-D数据库选项可以忽略
    B、如果【Mysql的bin目录】中包含空格,则需要使用“”包含,如:“C:\Program Files\mysql\bin\mysql” –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】

  • 方法二 进入mysql的控制台后,使用source命令执行
    Mysql>source 【sql脚本文件的路径全名】

感觉 SHOW ENGINE INNODB STATUS; 这个命令很强大啊

回滚 rallback
提交 commit

索引

  • 索引类型: 主键,唯一索引,全文索引

  • 主键: 值唯一,没有值为NULL德域的索引
    创建带有主键的表:

    CREATE TABLE 表名(fieldname columtype NOT NULL,
    [fieldname2...] PRIMARY KEY(fieldname [,fieldname2...]));
    

    给已经存在的表添加主键:

    ALTER TABLE tablename ADD PRIMARY KEY(fieldname1 [,fieldname2...]);
    
  • 创建普通索引

    • 创建表的时候,同时创建索引
    CREATE TABLE tablename(fieldname columntype, fieldname2 columntype, INDEX [indexname] (fieldname1 [,fieldname2...]));
    
    • 创建表的时候, 同时创建多个索引
    CREATE TABLE tablename(fieldname columntype,fieldname2 columntype, INDEX [indexname1](fie_name1,fieldname2), INDEX[indexname2] (fieldname1 [,fieldname2]));
    
    • 在创建表之后再创建索引:
       // 或者
       CREATE INDEX indexnamw on tablename(fieldname1 [,fieldname2...]);
    
    
  • 创建全文索引, 针对任意的 CHAR, VARCHAR TEXT 类型的域,其他类型都不能创建全文索引

    CREATE TABLE tablename (fieldname columntype, fieldname2 columntype, FULLTEXT(fieldname [,fieldname2...]));
    // 或者可以加上 INDEX 
    CREATE TABLE tablename (fieldname columntype, fieldname2 columntype, FULLTEXT INDEX(fieldname [,fieldname2...]));
    
    • 在一个已经存在的表中创建全文索引
    ALTER TABLE ft ADD FULLTEXT (f1,f2);
    

    使用全文索引 FULLTEXT()

    • 使用 MATCH(域名) AGAINST(具体值) 来返回检索结果
      SELECT * FROM ft2 WHERE MATCH(f1) AGAINST('Master');
  • 噪音单词: 某些常见的单词在查询的时候会被忽略

    • MySQL 有一个百分之五十的门限的东西, 任何在百分之五十以上的域出现的单词就会被认为是噪音单词, 会被查询忽略.
    • 一个单词少于三个字符会被忽略
    • 存在一个预定义的噪音单词列表, 包括the
  • 相关性:
    f1 的相关性

    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` 的相关性
```
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
    利用全集特征来查找单词,单词组合以及单词的部分

    • 后面的单词必须出现
    • 后面的单词不能出现
      < 让后面的单词相关性最小

    让后面的单词相关性最大
    () 在子表达式中用来分组单词
    ~ 没理解
    * 放到单词的结尾, 表示0个或多个字符
    "" 包含的部分是一个整体. 是完全匹配

  • 唯一索引:
    不允许自己索引的内容有重复.
    创建
    CREATE TABLE tablename (fieldname columntype, fieldname2 columntype, UNIQUE(fieldname[,fieldname2...]))

    在已经存在的表上创建:
    ALTER TABLE tablename ADD UNIQUE[indexname](fieldname[,fieldname2...]);

    或者
    CREATE UNIQUE INDEX indexname ON tablename(fieldname[,fieldname2...]);
    如果索引只包含一个域,那这个域不能包含重复值
    如果索引包含多个域,但单个域的值是可以重复的. 组成整个索引的域的组合是不能重复的.

  • 创建自动增加域
    建表时同时创建自动增加域
    CREATE TABLE tablename(fieldname INT AUTO_INCREMENT,[fieldname2...]);

    在已经存在的表中创建自动增加域
    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;

  • 高效使用索引
    索引非常少时, 返回结果非常慢.
    索引太多, 太占内存.
  • 如何使用索引
    WHERE 从句中
    SELECT first_name FROM customer WHERE surname>'C';
    select 后面不能触发索引 如SELECT first_name 这个frist_name 就不能触发索引

    适当域创建适当的索引, 如int列表中添加索引, 查找 MAX() 和 MIN() 就很快

    当索返回的数据是索引的一部分, 会直接触发索引

    ORDER BY 从句

    加速链接

    可以在通配符下使用, 不过通配符不能匹配首字母

  • 选择索引

    • 主键是最好的索引, 返回的行数越少越好
    • 枚举上的索引不是特别有用
    • 使用短索引,
    • 不要创建太多的索引
  • 使用最左边的前缀
    比如一个索引的顺序是 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';

不是按照从左到右的顺序不会使用索引
如:
    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';

    下面的会部分索引
    surname,first_name
    select * from customer where surname='Clegg' AND first_name='Yvonne'
  • 使用 EXPLAIN 分析MySQL 如何使用索引
    可以使用 EXPLAIN 查看索引的效率和状态, 然后提高索引效率
  • 在查询中计算
    在常数上进行计算, 不要在索引上计算
    如: commission 是索引
    索引上计算: commission+5<20
    常数上计算: commission<20-5
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容