标签:sele 利用 默认 对比 sql primary 存储引擎 包含 访问
如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
1.PRIMARY KEY 主键索引:一个表只能有一个主键,不允许有空值。
2.UNIQUE INDEX 唯一索引:索引列的值必须唯一,但允许有空值。
3.INDEX 普通索引:最基本的索引,它没有任何限制
4.FULLTEXT 全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。
5.INDEX 组合索引:多个字段上创建的索引
1.快速查找,减少服务器需要扫描的数据量
2.减少IO操作,避免临时表
1.Memory存储引擎使用哈希表。
优点:快,在内存中。缺点:不能持久化,重启没有了。
2.Mylsam和InnoDB使用B+树
优点:
1.B+树每个叶子节点可以包含更多的节点(相比于二叉树,平衡二叉树,红黑树等),既降低了树的高度,又将数据范围变为多个区间,加快了检索速度。
2.非叶子节点仅存储key值(B树非叶子节点也存储数据),叶子节点存储key值和数据(Mylsam存储引擎存储的是数据文件的地址)。
3.叶子节点两两之间指针连接,顺序查询性能更高。
数据和相邻的键值存储在一起;访问速度更快,在同一个树中;使用覆盖索引查询可以直接取出数值。
数据文件跟索引文件分开存放,先查询到索引,再去对应的文件位置查询数据
show status like 'Handler_read%';
Handler_read_first:读取索引第一个条目的次数
Handler_read_key:通过index获取数据的次数
Handler_read_last:读取索引最后一个条目的次数
Handler_read_next:通过索引读取下一条数据的次数
Handler_read_prev:通过索引读取上一条数据的次数
Handler_read_rnd:从固定位置读取数据的次数
Handler_read_rnd_next:从数据节点读取下一条数据的次数
数值越大,说明索引利用率更高
主键查询不会触发回表,其他索引会触发回表。
因为innodb的主键索引树叶子结点上保存的是全行数据,主键查询可以一次定位到数据的行数,取出数据内容;
而其他索引需要两次查询,第一次查询到主键值,再根据主键值查询出对应的数据。
explain的输出结果Extra字段为Using index时,能够触发索引覆盖。只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
将需要查询的结果字段建立组合索引
能够一次取出索要查询的结果字段,不需要回表
索引查询从最左边开始匹配
组合索引需要考虑索引的顺序和分组的合理性,如下,建立a、b、c三个索引,查询结果如表所示
在一个很长的字符串上建立索引,选取长度过长会消耗太多的内存,让索引查询效率变慢,所以需要选择一个合适的长度。
可以截取字符串的前几位和总数做对比,取出一个合适的长度。
前缀索引是一种能使索引更小更快的有效方法,但是也包含缺点:mysql无法使用前缀索引做order by 和 group by。
mysql默认启用索引下推,我们也可以通过修改系统变量optimizer_switch的index_condition_pushdown标志来控制
SET optimizer_switch = 'index_condition_pushdown=off';
索引下推适合INNODB引擎的二级索引。即第一次用第一级索引取出符合条件的部分数据,然后第二级别索引继续过滤条件查询,最终结果再回表根据主键查询。如下SQL:
现有student表建有组合索引(name,score),要求查询分数在90分以上且姓赵的同学。
SELECT *FROM student WHERE name LIKE '赵%' AND score>90;
先查询出姓赵的同学,然后根据分数过滤拿到主键id,根据主键id回表查询
Like:匹配模式必须要左边确定不能以通配符开头
必须要保证 OR 两端的条件都存在可以用的索引,该查询才可以使用索引
本来有一个字符串的字段建立了索引,查询的时候字符串后面匹配一个整型值,会导致全表扫描。
oracle数据库类型不匹配会报错
一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算
单表索引建议控制在5个以内
单索引字段数不允许超过5个(组合索引)
能使用limit的时候尽量使用limit
标签:sele 利用 默认 对比 sql primary 存储引擎 包含 访问
原文地址:https://www.cnblogs.com/farmersun/p/12490140.html