1.Mysql的索引采用B+Tree B/B+树又叫平衡多路查找树
MySQL中,索引属于存储引擎级别的概念,常见的2个引擎是MyISAM和InnoDB(默认)。https://www.cnblogs.com/tgycoder/p/5410057.html
1).MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。
2).InnoDB的辅助索引data域存储相应记录主键的值而不是地址。
3).MyISAM的索引方式也叫做“非聚集”的,InnoDB的索引叫做聚集索引。
每个InnoDB表具有一个特殊的索引称为聚集索引,除了聚集索引之外的索引叫二级索引,又叫辅助索引。如果您的表上定义有主键,该主键索引是聚集索引。
如果你不定义为您的表的主键时,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚集索引。如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。
度为d的B-Tree(就是每个节点里面的key的个数),设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key,其查找结点个数的渐进复杂度为O(logdN)。
为什么mysql的索引使用B+树而不是B树呢??
(1)B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。
(2)mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。
2.通过limit和offset 或只通过limit可以实现分页功能。
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
代码示例:
语句1:select * from student limit 9,4
语句2:slect * from student limit 4 offset 9
// 语句1和2均返回表student的第10、11、12、13行
// 语句2中的4表示返回4行,9表示从表的第十行开始
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96到最后的记录.
3.on使用是sql需要出现inner,否则需要用where关键字
找出表中重复出现的Email: select Email from Person group by Email having count(Email)>1;
LeetCode 184: 找到每组薪水最高的信息:
SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM
Employee
JOIN
Department ON Employee.DepartmentId = Department.Id
WHERE
(Employee.DepartmentId , Salary) IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)
;
多列的等值比较: select * from employeer where (name,age) in (('李四',33),('hh',23));
LeetCode185: 查询表里薪水最高的3个人: 没有用limit和order by
select e1.Name, e1.Salary
from Employee e1
where 3 >
(
select count(distinct e2.Salary)
from Employee e2
where e2.Salary > e1.Salary
);
4.union all 和 union的区别
union all效率上比union快很多
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录搜索。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。