MySQL小结

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只是简单的将两个结果合并后就返回。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章