一、常见的join查询:join太多张表,也会导致查询速度变慢。下面就来分析一下join语句。 1. 执行顺序: 我们写一条join查询语句一般都是:
但是MySQL执行的时候,并不是按顺序执行的,MySQL执行sql语句是从from开始执行的,上面这条语句的执行顺序是:
2. 内连接inner join: ![]() 如图所示,A和B分别代表两张表,C是它们共同的部分,inner join查出来的就是C,即表A和表B的共同部分。
3. 左连接left join: 还是上面那张图,A是左表的独有部分,C是AB的共有部分,left join就是左表的独有加上两表的共有,即左表的全部。所以left join查出来的是A表的全部。
4. 右连接right join: 右连接就是以右表为主,right join查出来的就是B的全部。
5. 只查询A的独占部分: 查询A的全部就是左连接,那么查询A独占就是:
6. 只查询B的独占部分:
7. 全连接: 全连接就是查询 A + B + C,即图中所有部分:
8. 查询A + B的独占部分,即排除C:
二、索引1. 是什么? 简单地说,索引是一种数据结构,帮助sql高效获取数据的一种数据结构,可类比字典的索引,可理解为排好序的快速查找的数据结构。所以索引会影响where后面的条件以及order by排序。 ![]() 比如现在要查找col2为91的这条记录,首先找到34,发现91比它大,往它的右边找,找到89,91还是比它大,继续往89右边找,就找到了91。 一般来说索引本身也很大,不会全部存储在内存中,因此索引往往以索引文件的形式存储在硬盘上。 2. 索引的优势:
3. 索引的劣势:
4. 索引分类: 假如现有一张user表,有id、name、email等字段。
那么问题来了,我分别在name和email上建单值索引,和建立一个name和email的复合索引,有什么区别?这两种方式都可以达到效果,但是复合索引的开销更小,因此建一个name和email的复合索引,比在name和email上分别建单值索引更优。 5. 基本语法:
6. mysql的索引结构: MySQL的索引总共有四种,分别是BTree索引、Hash索引、full-text全文索引和R-tree索引,最常用的就是Btree索引。 ![]() 首先从根节点开始,如果比17小,就往p1所指区域找,如果比35大,就往p3所指区域找,如果介于17和35之间,就往p2所指区域找。 7. 哪些情况适合建索引?
8. 哪些情况不适合建索引:
扫描二维码 |
|