索引:其实是根据我们的数据库结构抽取的另外一个映射我们数据类型的数据结构,一般实现了B-Tree或B+查询算法来快速定位到我们数据库的信息的结构,速度快,但并不是所有的查询都用索引,这个需要根据实际场景业务需求而定!
创建索引:
CREATE INDEX s2 ON s1(id) 在id上面创建名称为s2的索引
s2:索引名称
s1:创建索引的表
id:创建索引的列
查看执行计划:
索引分类:
PRIMARY, INDEX, UNIQUE 这3种是一类
PRIMARY 主键。 就是 唯一 且 不能为空。
INDEX 索引,普通的
UNIQUE 唯一索引。 不允许有重复。
FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。
可以看到已经使用了id列的索引,由于之前已经创建了s1的索引,后又创建的了s2的索引,执行计划选择的时候(possible_keys可能使用的索引)就可能选择id的PRIMARY索引,也可能选择创建的普通index的s1或s2索引,key列显示而实际选择的用的是PRIMARY索引
以下就是用到了自定义的索引
禁用select *使用selectcount(*) 统计行数
尽量少运算尽量避免全表扫描,如果可以,在过滤列建立索引
尽量避免在where子句对字段进行null判断
尽量避免在where子句使用!= 或者<>
尽量避免在where子句使用or连接
尽量避免对字段进行表达式计算
尽量避免对字段进行函数操作
尽量避免使用不是复合索引的前缀列进行过滤连接
尽量少排序,如果可以,建立索引
尽量少join尽量用join代替子查询(子查询会建临时表,然后销毁临时表,join不创建临时表,速度比子查询稍快)
尽量避免在where子句中使用in,notin或者having,使用exists,notexists代替
尽量避免两端模糊匹配 like %***%
尽量用union all代替union
尽量早过滤避免类型转换
尽量批量insert优先优化高并发sql,而不是频率低的大sql
联合索引: