数据库SQL,索引优化

一、Mysql 索引分为两种结构
1、Hash索引
a)  缺点
i.  只支持等值比较
ii.  无序,不支持范围查找
iii.  组合索引时,无法单独使用
iv.  通过 hash 命中后,数据库需要再次对比
v.  Hash 冲突量过大的情况下,性能较差
2、Btree索引
数据库SQL,索引优化_第1张图片
a ) 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
b)如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
c)系统奔溃后,MyISAM恢复起来更困难,能否接受;
d)MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差

3、Mysql执行计划(explain,放在sql语句之前即可)
执行计划值:
数据库SQL,索引优化_第2张图片
4、使用索引的 建议
a)  利用最左前辍(组合索引)
b)  不能过多建立索引
c)  尽量扩展索引(通过组合索引)而不要新建索引
d)  不同值较少的列不必要建立索引(如性别)

5、索引优化
--索引什么时候失效?
索引失效实在使用 like语句查询时失效
--sql本身优化
不用 *,少用函数和like,不用嵌套语句等
a)为合适的列建立索引
  • 在 where 从句,group by 从句,order by 从句,on 从句中出现的列
  • 索引字段越小越好
  • 离散度高的列放到联合索引的前面
索引字段长度 例如:
此处展示的语句用于创建一个索引,索引使用列名称的前10个字符。
CREATE INDEX part_of_name ON customer (name(10));

因为多数名称的前10个字符通常不同,所以此索引不会比使用列的全名创建的索引速度慢很多。另外,使用列的一部分创建索引可以使索引文件大大减小,从而节省了大量的磁盘空间,有可能提高INSERT操作的速度。
离散度 例如:
SELECT * FROM payment WHERE staff_id = 2 AND customer_id = 584;
上述 SQL 语句,是 index(staff_id,customer_id) 合理,还是 index(customer_id,staff_id) 合理。执行语句如下:
SELECT count(DISTINCT customer_id) , count(DISTINCT staff_id) FROM payment;-- 结果是 599 2
由于 customer_id 的离散度更大,所以应该使用 index(customer_id,staff_id)
b)找到重复和冗余的索引
之所以要找到重复和冗余的索引,是因为过多的索引不但影响写入,而且影响查询,索引越多,分析越慢。那么为何重复索引、冗余索引?概念如下:
重复索引是指相同的列以相同的顺序建立的同类型的索引,如下表中 primary key 和 ID 列上的索引就是重复索引,例子如下:
CREATE TABLE test( id INT NOT NULL PRIMARY KEY , NAME VARCHAR(10) NOT NULL , title VARCHAR(50) NOT NULL , UNIQUE(id)) ENGINE = INNODB;
UNIQUE(ID)PRIMARY KEY 重复了。
冗余索引是指多个索引的前缀列相同,或是在联合索引中包含了主键的索引,例子如下:
CREATE TABLE test( id INT NOT NULL PRIMARY KEY , NAME VARCHAR(10) NOT NULL , title VARCHAR(50) NOT NULL , KEY(NAME , id)) ENGINE = INNODB;

c)删除不用的索引
目前 MySQL 中还没有记录索引的使用情况,但是在 PerconMySQL 和 MariaDB 中可以通过 INDEX_STATISTICS 表来查看哪些索引未使用,但在 MySQL 中目前只能通过慢查询日志配合共组 pt-index-usage 来进行索引使用情况的分析。
pt-index-usage -uroot -p '123456' /usr/local/var/mysql/luyiyuandeMacBook-Pro-slow.log;

d)加冗余字段
不能所有的字段都加成冗余字段 ,一定是不常变化的字段为冗余字段
优化前:
汽车表:
id,name,汽车的尺寸,汽车颜色,汽车的生产厂家表的id字段
生产厂家表
id,name,地址信息。
 
我需要展示骑车的信息列表,列表展示信息中需要包含生产厂家时,如果 left join,效率会低
如果在单表中查询,速度快,
 
我现在对数据库进行添加冗余字段,对数据库数据优化,
 
优化后:
汽车表:
id,name,汽车的尺寸,汽车颜色,汽车的生产厂家表的id字段,厂家的名字
生产厂家表
id,name,地址信息。
 
什么时候可以加冗余字段?什么情况下不可以加呢?
如果这个冗余字段的数据经常改变,就不建议加冗余字段了

你可能感兴趣的:(mysql,数据库,索引)