索引可以在创建表的时候一起创建索引,这种方式这里就不记录,如果感兴趣,可自行百度。
①方式一
ALTER TABLE 表名 ADD INDEX 索引名(字段);
②方式二
CREATE INDEX 索引名 ON 表名(字段)
SHOW INDEX FROM 表名;
①方式一
ALTER TABLE 表名 DROP INDEX 索引名
②方式二
DROP INDEX 索引名 ON 表名;
MySQL5.7及以前添加的降序索引是通过反向扫描的方式,并没有真正的创建,MySQL8.0真正创建了降序索引。
MySQL8.0可以让索引隐藏起来失去作用,如果删除索引后发现问题,还可以马上回复,节约了重新创建浪费的大量时间。要注意的是隐藏索引同样会消耗插入、更新、删除的性能,所以如果长期不使用就将隐藏索引删除掉。
首先,连接表的数量尽量不要超过3张,每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重映像查询的效率。
其次,对于WHERE 条件创建索引,因为WHERE才是对数据条件的过滤,如果在数据量非常大的情况下,没有WHERE条件过滤是非常可怕的。
最后,对于连接的字段创建索引,并且该字段在多张表中的类型必须一致,不一致会自动使用类型转换函数,无法使用索引。
数据大小指的是该类型表示的数据范围的大小,TINYINT、MEDIUMINT、INT、BIGINT占用内存空间依次增大。
ALibaba 强制 在varchar字段建立索引时,必须指定索引长度,没必要对全字段建立索引,根据文本区分决定索引长度。
可以通过截取字段一部分内容建立索引,这个叫做前缀索引,这样也可以找到对应的字符串。
对于截取多少的问题,有一个公式count(distinct left(列名, 索引长度)) / count(*)
,这个值越接近1越好,当然如果几个索引长度所对应的值都差不多大,取索引长度比较小的。
因为索引前缀是对截取的部分字段作为索引,所以无法对整个字段使用索引排序。
散列度公式count(distinct 字段名)/count(*)
由于最左前缀原则,,可以增加联合索引的使用率
索引不是越多越好,建议一张表最多不超过6个,原因:
①索引占用磁盘空间,索引越多磁盘空间越大。
②索引影响INSERT、DELETE、UPDATE等语句性能,表中数据更改的同时,索引也要更改,会造成负担。
③优化器在选择如何优化查询时,会根据统一信息,对每个可以用到的索引进行评估,如果有多个索引可以用于查询,会增加SQL优化器生成执行计划的时间,降低查询性能。