小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
- 什么是索引?
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。简而言之就是排好序的快速查找的数据结构。
-
常见的索引类型
- 单值索引(单列索引):一个索引只包含单个列,一个表中可以有多个单列索引。
- 唯一索引:索引列必须唯一,但可以允许有空值
- 复合索引:一个索引包含多个列
-
适用索引的优缺点
-
优点
- 查找 :提高数据检索效率,降低IO成本。
- 排序:通过索引对数据进行排序,降低排序成本,降低cpu消耗
-
缺点
- 实际上索引也是一张表,该表保存了主键与索引字段,并指向索引的记录,所以索引列也需要占空间。
- 更新表时(insert、update、delete)不仅要保存数据还要更新保存索引文件新添加的索引列。
-
-
哪些情况适合创建索引?
- 主键自动建主键索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- 在高并发下倾向建立组合索引
- 查询中的排序字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或者分组的数据
-
哪些情况不适合建索引?
- 频繁更新的字段
- where条件用不到的字段不创建索引
- 表记录太少
- 经常增删改的表
- 数据重复太多的字段,为它建索引意义不大(假如一个表有10万,有一个字段只有T和F两种值,每个值的分布概率大约只有50%,那么对这个字段的建索引一般不会提高查询效率,索引的选择性是指索引列的不同值数据与表中索引记录的比,如果,一个表中有2000条记录,表中索引列的不同值记录有1980个,这个索引的选择性为1980/2000=0.99,如果索引项越接近1,这个索引效率越高)
(3)关于SQL优化
sql优化没有固定的标准,本质上就是做减法,减少io、cpu等消耗,让sql执行的更快,最终达到我们的性能要求。
sql优化主要从三个方面进行
- 尽量走索引;
- 尽可能避免全表扫描;
- 尽量减少无效数据的查询;
一些优化方法如下:
- 首先考虑在 where 及 order by 涉及的列上建立索引
- 尽量避免在 where 子句中对字段进行 null 值判断
- 尽量避免在 where 子句中使用!=或<>操作符
- 尽量避免在 where 子句中使用 or 来连接条件
- in 和 not in 也要慎用,否则会导致全表扫描
- 尽量避免在字段开头模糊查询 like '%XXX'
- 尽量避免在 where 子句中对字段进行表达式或函数操作
- 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算
- 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*
- order by 条件要与where中条件一致,否则order by不会利用索引进行排序
order by优化
-
避免filesort
-
尽量在索引上进行排序,遵照最佳左前缀原则
-
filesort有两种排序:
- 双路排序:两次磁盘扫描
- 单路排序:一次性读取保存在内存中,没拉完的数据再次拉
单路排序是后出的,总体好于双路排序
-
优化策略:
- 增大sort_buffer_size参数的设置
- 增大max_length_for_sort_data参数的设置
原因:尽可能一次拿到内存