单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
组合索引:即一个索引包含多个列。
如果我们的查询where条件只有一个,我们完全可以用单列索引,这样的查询速度较快,索引也比较瘦身。如果我们的业务场景是需要经常查询多个组合列,
不要试图分别基于单个列建立多个单列索引(因为虽然有多个单列索引,但是MySQL只能用到其中的那个它认为似乎最有效率的单列索引)。
这是因为当SQL语句所查询的列,全部都出现在复合索引中时,此时由于只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多
1.如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引,
但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。
2.组合索引遵从最左原则
explain 分析sql的性能问题
主要的列:
table :表名
type :mysql链接操作的类型
system 只有一行,const链接的特属类型
const 表中记录的最大值,只有一行,所以类型为常量
ref 不是唯一索引和主键索引的类型
rang 返回范围的行
index 这个链接类型对前面的表中的每个记录进行联合完全扫描(比ALL更好,因为索引一般小于表数据量)
All 全表扫描
数据库建立索引常用的规则如下: (理论上重复率高的字段数值不适合建立索引)
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
8. 拼音字母做值不适合作为索引
3. 为什么性别不适合建索引呢?因为你访问索引需要付出额外的IO开销,你从索引中拿到的只是地址,要想真正访问到数据还是要对表进行一次IO。
假如你要从表的100万行数据中取几个数据,那么利用索引迅速定位,访问索引的这IO开销就非常值了。但如果你是从100万行数据中取50万行数据,
就比如性别字段,那你相对需要访问50万次索引,再访问50万次表,加起来的开销并不会比直接对表进行一次完整扫描小。(理论上重复率高的字段数值不适合建立索引)
4. 聚组索引和非聚组索引,总的而言,用的多的是非聚组索引,聚组索引的资源比较宝贵
5.索引的不足之处:
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
单列索引:(建立了多个单列索引,查询时严格按照执行效率最高的进行原则)
eg: ALTER TABLE t_user ADD INDEX_name(username),Index_password(password);
组合索引: (遵从最左原则,又称为多列索引)
eg: ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
添加唯一索引:
eg: ALTER TABLE `table_name` ADD UNIQUE (SID); //如身份证号具有唯一性,常可作为唯一索引使用
添加全文索引:
eg: ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
参考链接:https://www.cnblogs.com/mr-wuxiansheng/p/7679205.html