diff --git "a/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21014\346\227\245\347\264\242\345\274\225.md" "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21014\346\227\245\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..0556b813a8b287f4262907c1488e4c099322f497 --- /dev/null +++ "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21014\346\227\245\347\264\242\345\274\225.md" @@ -0,0 +1,159 @@ +一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。 + +对于一本字典来说,查找某个汉字有两种方式: + 第一种方式:一页一页挨着找,直到找到为止,这种查找方式属于**全字典扫描**。效率比较低。 + 第二种方式:先通过目录(索引)去定位一个大概的位置,然后直接定位到这个位置,做局域性扫描,缩小扫描的范围,快速的查找。这种查找方式属于**通过索引检索**,效率较高。 + +t_user表 + +| id(idIndex) | name (nameIndex) | email(emailIndex) | address(emailAddressIndex) | +| ----------- | ---------------- | ----------------- | -------------------------- | +| 1 | zhangsan... | - | - | +| 2 | lisi | - | - | +| 3 | wangwu | - | - | +| 4 | zhaoliu | - | - | +| 5 | hanmeimei | - | - | +| 6 | jack | - | - | + +select *from t _user where name= 'jack' ; + 以上的这条SQL语句会去name字段上扫描,因为查询条件是:name='jack' + 如果name字段上没有添加索引(目录),或者说没有给name字段创建索引,MySQL会进行全扫描,会将name字段上的每一个值都比对一遍。效率比较低。 + +MySQL在查询方面主要有两种方式: + 1.全表扫描 + 2.根据索引检索 + +注意: + 在实际中,汉语字典前面的目录是排序的,按照a b c d e f....排序,只有排序了才会有区间查找这一说! + (缩小扫描范围其实就是扫描某个区间!) + 在mysql数据库当中索引也是需要排序的,并且这个所以的排序和TreeSet数据结构相同。TreeSet底层是一个自平衡的二叉树! + 在mysql中,索引是一个B-Tree数据结构。 + +遵循左小右大原则存放,采用中序遍历方式遍历取数据。 + +###### 索引实现原理(了解) + +用户表:t_user + +| id(PK) | name | 每一行记录在硬盘上都有物理存储编号 | +| ------ | -------- | ---------------------------------- | +| 100 | zhangsan | ox1111 | +| 120 | lisi | ox2222 | +| 99 | wangwu | ox8888 | +| 88 | zhaoliu | ox9999 | +| 101 | jack | ox6666 | +| 55 | lucy | ox5555 | +| 130 | tom | ox7777 | + +在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是PK(主键)。mysql,一个字段上如果有unique约束的话,也会自动创建索引对象 + +在任何数据库中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号 + +在mysql当,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引存储在哪里,索引在mysql中都是一个树的形式存在(自平衡二叉树:B-Tree) + +![img](https:////upload-images.jianshu.io/upload_images/9407204-3a08dd9367c0ae88.png?imageMogr2/auto-orient/strip|imageView2/2/w/1144/format/webp) + +左小右大。表中字段不会动,索引对象会排序 + +        + +------ + +在mysql中,主键上,以及unique字段上都会自动添加索引 + +给字段加索引的情况: + 1.数据量庞大(根据硬件条件来决定多大算大) + 2.该字段经常出现在where的后面,以条件的形式存在,因为该字段总是被扫描 + 3.该字段很少的DML(insert delete update操作),因为DML之后,索引需要重新排序。 + +建议:不要随意添加索引,因为索引也需要维护,太多的话反而会降低系统的性能。 + 可以通过主键查询,通过unique约束的字段进行查询,效率比较高 + +- ###### 创建索引 + +语句:create index emp_ename_index on emp(ename); + 给emp表的ename字段添加索引,起名emp_ename_index + +- ###### 删除索引 + +语句:grop index emp_ename_index on emp; + 将emp表上的emp_ename_index索引对象伤处 + +------ + +mysql中,查看一个sql语句是否使用了索引进行检索 + explain select * from emp where ename = 'KING'; + +![img](https:////upload-images.jianshu.io/upload_images/9407204-50ae8ea5ae974316.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp) + +扫描14条记录rows是14:说明媒体又使用索引。type类型是All + +执行create index emp_ename_index on emp(ename);后 + 再执行explain select * from emp where ename = 'KING'; + +![img](https:////upload-images.jianshu.io/upload_images/9407204-b156532d2ad79017.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp) + +type:ref使用索引,rows是1条 + +------ + +###### 索引失效 + +- 情况一: + select * from emp where ename like '%T'; + ename上即使添加了索引,也不会走索引, + 因为模糊匹配中以“%”开头了, + 尽量避免模糊查询的时候以“%”开始,一种优化的手段/策略 + +![img](https:////upload-images.jianshu.io/upload_images/9407204-2ab69fa5a5576590.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp) + +ename上有索引也没有用 + +- 情况二: + 使用or的时候会失效, + 如果使用or,要求or两边的条件字段都要有索引,才会走索引, + 如果其中一边有一个字段没有索引,那么另一个字段上的索引也会失效。 + 所以这就是为什么不建议使用or的原因。 + +![img](https:////upload-images.jianshu.io/upload_images/9407204-3970285bb19af8a6.png?imageMogr2/auto-orient/strip|imageView2/2/w/1176/format/webp) + +ename上有索引 + +- 情况三: + 使用复合索引时,没有使用左侧的列查找,索引失效 + 复合索引:两个或以上字段联合起来加一个索引 + +![img](https:////upload-images.jianshu.io/upload_images/9407204-86fb13ad2bb4a8f1.png?imageMogr2/auto-orient/strip|imageView2/2/w/1155/format/webp) + +左侧可以,右侧失效 + +- 情况四: + 在where中索引列参加了运算,索引失效 + +![img](https:////upload-images.jianshu.io/upload_images/9407204-d612b90901828b12.png?imageMogr2/auto-orient/strip|imageView2/2/w/1182/format/webp) + +- 情况五: + 在where中索引列使用了函数 + +![img](https:////upload-images.jianshu.io/upload_images/9407204-29f8cf0867e8aa3f.png?imageMogr2/auto-orient/strip|imageView2/2/w/1165/format/webp) + +使用了lower函数 + +------ + +索引是各种数据库进行优化的重要手段。 + 优化的时候优先考虑的因素就是索引。 + +索引在数据库当中分了很多类? + 单一索引:—一个字段上添加索引。 + 复合索引:两个字段或者更多的字段上添加索引。 + +  主键索引:主健上添加索引。 + 唯一性索引:具有unique约束的字段上添加索引。 + +…… + +注意:唯一性比较弱的字段上添加索引用处不大。 + + + diff --git "a/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21015\346\227\245\350\247\206\345\233\276.md" "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21015\346\227\245\350\247\206\345\233\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..94ecb0654ceb078331dfa3678545c87040012715 --- /dev/null +++ "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21015\346\227\245\350\247\206\345\233\276.md" @@ -0,0 +1,78 @@ +##### 创建视图对象、删除视图对象 + +表复制:create table dept2 as select * from dept; + dept2表中数据: + select * from dept2; + +![img](https:////upload-images.jianshu.io/upload_images/9407204-d5f49a5ad2ba8098.png?imageMogr2/auto-orient/strip|imageView2/2/w/499/format/webp) + +- 创建视图对象: + create view dept2_view as select * from emp; +- 删除视图对象: + drop view dept2_view; + +注意:只有DQL语句才能以view的形式创建 + create view view_name as DQL语句; + +## 从单个表创建视图 + +在此示例中,从表`Student_Detail`创建一个名称为`DetailsView`的视图。 + +``` +CREATE VIEW DetailsView AS +SELECT NAME, ADDRESS +FROM Student_Details +WHERE STU_ID < 4; +``` + +就像表查询一样,可以查询视图来查看数据。 + +``` +SELECT * FROM DetailsView; +``` + + + +## 从多个表创建视图 + +只需在`SELECT`语句中包含多个表,即可创建多个表中的视图。 + +在给定的示例中,从两个表`Student_Detail`和`Student_Marks`创建名称为:`MarksView`的视图。 + +创建视图语句: + +``` +CREATE VIEW MarksView AS +SELECT Student_Detail.NAME, Student_Detail.ADDRESS, Student_Marks.MARKS +FROM Student_Detail, Student_Mark +WHERE Student_Detail.NAME = Student_Marks.NAME; +``` + +查询显示视图 - `MarksView` 的数据的语句: + +``` +SELECT * FROM MarksView; +``` + + + +## 删除视图 + +可以使用`Drop View`语句删除视图。 + +**语法** + +``` +DROP VIEW view_name; +``` + +如果要删除视图 - `MarksView`,可以使用以下语句: + +``` +DROP VIEW MarksView; +``` + + + + + diff --git "a/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21019\346\227\245\344\272\213\345\212\241\344\270\216\346\270\270\346\240\207.md" "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21019\346\227\245\344\272\213\345\212\241\344\270\216\346\270\270\346\240\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..25ba79dedb8e3b8835d6ffbb729ad1b4e4406aee --- /dev/null +++ "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21019\346\227\245\344\272\213\345\212\241\344\270\216\346\270\270\346\240\207.md" @@ -0,0 +1,55 @@ +**事务** + +**事务的特性:****ACID** + +A,也就是原子性(Atomicity)。原子的概念就是不可分割,你可以把它理解为组成物质的基本单位,也是我们进行数据处理操作的基本单位。 + +C,就是一致性(Consistency)。一致性指的就是数据库在进行事务操作后,会由原来的一致状态,变成另一种一致的状态。也就是说当事务提交后,或者当事务发生回滚后,数据库的完整性约束不能被破坏。 + +I,就是隔离性(Isolation)。它指的是每个事务都是彼此独立的,不会受到其他事务的执行影响。也就是说一个事务在提交之前,对其他事务都是不可见的。 + +D,指的是持久性(Durability)。事务提交之后对数据的修改是持久性的,即使在系统出故障的情况下,比如系统崩溃或者存储介质发生故障,数据的修改依然是有效的。因为当事务完成,数据库的日志就会被更新,这时可以通过日志,让系统恢复到最后一次成功的更新状态。 + + + +**事务的控制** + +START TRANSACTION 或者 BEGIN,作用是显式开启一个事务。 + +COMMIT:提交事务。当提交事务后,对数据库的修改是永久性的。 + +ROLLBACK 或者 ROLLBACK TO [SAVEPOINT],意为回滚事务。意思是撤销正在进行的所有没有提交的修改,或者将事务回滚到某个保存点。 + +SAVEPOINT:在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点。 + +RELEASE SAVEPOINT:删除某个保存点。 + +SET TRANSACTION,设置事务的隔离级别。 + + + + + +**游标** + +定义:是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。 + +常用步骤 + +定义游标:DECLARE cursor_name CURSOR FOR select_statement + +打开游标:OPEN cursor_name + +从游标中取得数据:FETCH cursor_name INTO var_name ... + +关闭游标:CLOSE cursor_name + +释放游标:DEALLOCATE PREPARE + +注意:不同的RDBMS使用语法不同 + +性能 + +好处:灵活性强,可以解决复杂的数据处理问题,对数据进行逐行扫描处理 + +不足:使用游标过程中会对数据加锁,当业务并发大时,效率不高。同时,资源消耗较大。建议尽量不用。 \ No newline at end of file