Mysql索引 用还是不用
- 当数据量小于1000行,可以不用索引
- 当数据重复度大,比如高于10%,可以不用索引
索引的价值是帮你快速定位的,如果你想定位的数据有很多,那么索引就失去了它的价值。我们不仅要看字段中的数值个数,还要根据数值的分布情况来考虑是否建立索引。
索引的种类
- 从功能逻辑上分为:
- 普通索引:基础的索引,没有任何的约束,主要用于提高查询效率
- 唯一索引:在普通索引的基础上增加唯一性的约束,一张表里可以有多个唯一索引。
- 主键索引:NOT NULL+ UBIQUE 在唯一索引的基础上增加了不为空的约束。一张表里最多有1个主键索引。
- 全文索引: 用的不多,mysql 自带的全文索引只支持英文。
- 按照物理实现方式:
- 聚集索引:表中的数据按索引的排序方式进行存储,对查找行很有效。每一个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。(找到了索引,在它后面就是数据行)
- 非聚集索引(二级索引或者辅助索引):数据库系统会有单独的存储存放非聚集索引,这些索引项是按顺序存储的,但索引项指向的内容是随机的。像按部首查字典一样,系统会进行两次查找,第一次先找到索引,第二次找到索引对应的位置取出数据行。它维护单独的索引表(只维护索引,不维护索引指向的数据),为数据检索提供方便。
- 聚集索引和非聚集索引在使用上的区别:
- 聚集索引的叶子节点存储的是我们的数据记录,非聚集索引存储的是数据位置,非聚集索引不会影响数据表的物理存储顺序。
- 一个表只能有一个聚集索引,因为只能有一种排序存储的方式,但可以有多个非聚集索引。
- 使用聚集索引的时候数据的查询效率高,但如果对数据进行插入,删除,更新,效率会比非聚集索引低。
总结
- 对WHERE字句的字段建立索引,可以大幅提升查询效率。
- 使用聚集索引的时候数据的查询效率高,如果查询次数比较多,还是尽量使用主键索引进行数据查询。
- 按字段个数进行划分:
- 单一索引:索引列为1列时,
- 联合索引:多个列组合在一起创建的索引。联合索引存在最左匹配原则:按照最左优先的方式进行索引的匹配。
索引也会占用存储空间、降低数据写操作等不足
mysql 日志
一般会设置慢查询日志。
mysql 思维训练
- 实现select 取行号
select p.name, p.type, p.view, @row_num:=@row_num+1 as row_num from products a , (select @row_num:=0) b order by p_view
- 对每个分组排序,并取出前n个
SELECT p_type, p_name, p_view, row_num from(
SELECT p_type, p_name, p_view IF(@bak=p_type,@row_num:=row_num+1,@row_num:=1) as row_num, @bak:=p_type
from
(SELECT p_type, p_name, p_view from products
ORDER BY p_type, p_view desc ) a,(SELECT @row_num:=0,@bak:=' ’)b ) c
where c.row_num <2
网友评论