索引介绍:
高效获取数据的数据结构
使用B+树结构( 搜索树,并不一定是二叉树)
索引是存储在磁盘文件中的(可能是单独是索引文件中,也可能和数据一起存储在数据库文件中)
索引的优势和劣势
优势:
可以提高数据检索效率,降低数据 库的IO成本,类似于书的目录;
通过索引列对数据进行检索,降低数据排序的成本,降低了CPU的消耗;
劣势:
索引回占据磁盘空间;
索引虽然会提高查询效率,但是会降低更新表的效率
常用索引分类:
单列索引:
普通索引:mysql 中基本索引,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹是为了查询快一点;
唯一索引:索引列中的值必须是唯一的。但是允许为空值;
主键索引:是一种特殊的唯一索引,不允许有空值
组合索引:
在表中的多个字段组合上创建的一个索引;
组合索引的使用,需要遵循最左前缀原则
一般情况下,建议使用组合索引代替单列索引(主键索引除外)
sql语句优化
索引优化
为搜索字段(where 中的条件)、排序字段、select查询列等创建合适的索引(要考虑数据的业务场景,查询多还是增删多);
尽量创建组合索引病注意组合索引的创建顺序,按照顺序组织查询条件、尽量筛选粒度大的查询条件放到最左边
尽量使用覆盖索引,select 语句尽量使用明确字段,不要使用*
order by、 group by语句尽量使用到索引
其他优化:
尽量不适用count(*),尽量使用count(主键)
count(*):查询行数,遍历所有的行和列
count(列字段):查询指定列不为null 的行数,如果列可以为空,则count(*)不等于count(列),
count(1)
join两张表的关联字段最好都建立索引,而且最好字段类型是一只的
where 条件中尽量不要使用1=1、not in 语句(建议使用 not exists)
不用mysql 的内置函数,因为内置函数不会建立查询缓存
合理利用慢查询日志、explain执行计划查询、show profile查看sql执行时的资源使用情况