索引学习
1.辛普森悖论
含义:
样本集合进行分组研究时,在分组比较中都占优势的一方,在总评中有时反而是失势的一方,这种有悖常理的现象,就成为 “辛普森悖论”。
比如
坏处:
对于那些不怀好意的人,他们很容易对数据进行拆分或归总,得到一个对自己有利的统计数据,从而误导甚至操纵别人。
辛普森悖论让我想起我们平时逛淘宝或者点外卖时的策略,很多人都是选评分高的,但评分高的并不一定是最好的,有可能他购买人数不多,但刷了很多好评。这也是为什么购物出现扫码返3元的原因。
应该看购买人数,看好评,看差评,各种对比,最后选择某一家店,这实际是使用了多模型的策略,相当于做了个整体的评估,最后得到了哪个店最好的结论。
解决:
选取数据分析数据的时候,一定要注意各组数据的权重(各组数据在整体评价中占的比例,一个有效的解决方法:对于占总体少数比例的样本加以更高的权重,也就是 “逆概加权”
2.聚类
聚类既能作为一个单独过程,用于找寻数据内在的分布结构,
主要的算法
包括层次聚类,k均值算法,EM算法,DBSCAN算法,OPTICS算法,Mean Shift算法,谱聚类算法。
K-Means算法的概念:K表示聚类的个数,Means表示每个簇以该簇内所有样本的均值为质心来代表该簇。K-Means算法先随机选取k个样本作为初始化的k个簇的质心,然后计算所有样本到这k个质心的距离,对于每个样本,将其划分到距离最近的质心所在簇类,并更新簇的质心
K-Means算法的优点:原理简单,容易实现;只需要调节k这一个参数;收敛速度较快
缺点:k值的确定;使用比较局限,只适用于球状的数据分布;对质心的初始化比较敏感,容易陷入局部最优解
EM算法比K-means算法计算复杂,收敛也较慢,不适于大规模数据集和高维数据,但比K-means算法计算结果稳定、准确。应用领域:
EM经常用在机器学习和计算机视觉的数据集聚(Data Clustering)领域。
3.数据库索引
索引(Index)是帮助MySQL高效获取数据的数据结构。索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据
建立索引的优缺点
优点:查询速度快
缺点:增删改慢,因为数据库要同步去维护索引文件,所以速度慢
索引检索为什么快
索引结构:B+Tree
MySQL主要有两种结构:Hash索引和B+ Tree索引,InnoDB引擎,默认的是B+树
什么情况下会使索引失效?
(1)like
(2)like “%123%,前面不能+%
(3)使用 关键字 in ,or ,null,!=
Sql优化:
(1)查看数据表中是否存在大量的冗余字段,字段数据类型是否合理
(2)尽可能的使用varchar代替char 建表数据类型,能用数值的绝对不用字符存储
(3)尽量避免null值,使用默认值替代空值,数值型可以使用0,字符型可以使用空字符串
查看sql语句是否规范
(1)避免使用关键字:or ,in,not in ,!=,<>,避免使用select *
(2)尽量避免子查询,大部分子查询都可以连接查询
(3)用到or的地方可以使用union去代替实现
(4)用到in的地方可以使用exists去代替
索引的数据结构?
索引的数据结构主要有B+树和哈希表,对应的索引分别为B+树索引和哈希索引。InnoDB引擎的索引类型有B+树索引和哈希索引,默认的索引类型为B+树索引。
B+树索引:
熟悉数据结构的同学都知道,B+树、平衡二叉树、红黑树都是经典的数据结构。在B+树中,所有的记录节点都是按照键值大小的顺序放在叶子节点上
因为B+树具有有序性,并且所有的数据都存放在叶子节点,所以查找的效率非常高,并且支持排序和范围查找。
哈希索引:
哈希索引是基于哈希表实现的,对于每一行数据,存储引擎会对索引列通过哈希算法进行哈希计算得到哈希码,并且哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向数据行的指针作为哈希表的value值。这样查找一个数据的时间复杂度就是o(1),一般多用于精确查找。
区别:
哈希索引一般多用于精确的等值查找,B+索引则多用于除了精确的等值查找外的其他查找。在大多数情况下,会选择使用B+树索引。
哈希索引不支持排序,因为哈希表是无序的。
哈希索引不支持范围查找。
哈希索引不支持模糊查询及多列索引的最左前缀匹配。
因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,而B+树索引的性能是相对稳定的,每次查询都是从根节点到叶子节点
索引的种类有哪些?
主键索引:数据列不允许重复,不能为NULL,一个表只能有一个主键索引
组合索引:由多个列值组成的索引。
唯一索引:数据列不允许重复,可以为NULL,索引列的值必须唯一的,如果是组合索引,则列值的组合必须唯一。
全文索引:对文本的内容进行搜索。
普通索引:基本的索引类型,可以为NULL
什么是最左匹配原则?
最左匹配原则:从最左边为起点开始连续匹配,遇到范围查询(<、>、between、like)会停止匹配。
例如建立索引(a,b,c),大家可以猜测以下几种情况是否用到了索引。
第一种
select * from table_name where a = 1 and b = 2 and c = 3
select * from table_name where b = 2 and a = 1 and c = 3
上面两次查询过程中所有值都用到了索引,where后面字段调换不会影响查询结果,因为MySQL中的优化器会自动优化查询顺序。
第二种
select * from table_name where a = 1
select * from table_name where a = 1 and b = 2
select * from table_name where a = 1 and b = 2 and c = 3
答案是三个查询语句都用到了索引,因为三个语句都是从最左开始匹配的。
第三种
select * from table_name where b = 1
select * from table_name where b = 1 and c = 2
答案是这两个查询语句都没有用到索引,因为不是从最左边开始匹配的
第四种
select * from table_name where a = 1 and c = 2
这个查询语句只有a列用到了索引,c列没有用到索引,因为中间跳过了b列,不是从最左开始连续匹配的。
第五种
select * from table_name where a = 1 and b < 3 and c < 1
这个查询中只有a列和b列使用到了索引,而c列没有使用索引,因为根据最左匹配查询原则,遇到范围查询会停止。
第六种
select * from table_name where a like 'ab%';
select * from table_name where a like '%ab'
select * from table_name where a like '%ab%'
索引在什么情况下会失效?
在上面介绍了几种不符合最左匹配原则的情况会导致索引失效,除此之外,以下这几种情况也会导致索引失效。
条件中有or,例如select * from table_name where a = 1 or b = 3
在索引上进行计算会导致索引失效,例如select * from table_name where a + 1 = 2
在索引的类型上进行数据类型的隐形转换,会导致索引失效,例如字符串一定要加引号,假设 select * from table_name where a = '1' 会使用到索引,如果写成select * from table_name where a = 1 则会导致索引失效。
在索引中使用函数会导致索引失效,例如select * from table_name where abs(a) = 1
在使用like查询时以%开头会导致索引失效
索引上使用!、=、<>进行判断时会导致索引失效,例如select * from table_name where a != 1
索引字段上使用 is null/is not null判断时会导致索引失效,例如select * from table_name where a is null
学习来源:
https://blog.csdn.net/zydybaby/article/details/111886554
https://www.cnblogs.com/williamjie/p/11187470.html