MySQL学习笔记:适合创建索引的情况

一、具有唯一性(UNIQUE)特征的字段

其中主键索引是在建表时设立主键后数据库自动设立的一种数据结构,故不需要进行添加,但其他具有唯一性特征的字段需要在建表时声明UNIQUE,或是在建表后ALTER TABLE (table_name) ADD UNIQUE INDEX(index_name)或CREATE UNIQUE INDEX (index_name) ON (table_name)进行添加;

二、通过GROUP BY,ORDER BY进行分组/排序的字段

适合创建联合索引,如果仅创建两个单个索引会因读取SQL语句的顺序,对先读取的GROUP BY语句,会优先选择在其上面创建的单个索引,从而忽略了ORDER BY上的索引,影响查询的预期值,其中在ORDER BY 上创建的索引在8.0版本之后均支持降序(DESC)索引,在8.0之前是无法进行降序索引的;

三、频繁进行WHERE查询的语句

对SQL查询语句中频繁使用WHERE (字段名)= ' 某条件'的情况来说,适合创建索引提高查询效率,如果是WHERE后需多个字段,多个条件的情况,建议使用联合索引,联合索引中包含的各字段名,根据最左匹配原则,将最常查询的字段放在联合索引的最左侧;

四、使用了DISTINCT的字段

对需要去重的字段进行添加索引也能提高查询效率;

五、使用UPDATE DELETE 的WHERE条件列

当在对WHERE条件列添加索引后,我们在查询时会先通过索引找出WHERE(字段名)所在的那条记录,之后假如我们对这条记录中没有创建索引的字段(非索引字段)下面的数据进行更新时,提升的效率会更高,那是因为非索引字段的更新不需要对索引进行维护;

六、多表JOIN的情况下

因为一次JOIN代表一次嵌套循环,数量级增长十分快,所以表JOIN的数量不得超过3张,以免影响查询效率。通过实际测试发现,在连接条件+WHERE(字段名)上创建联合索引,能让查询效率最大化;

七、数据区分度比较高的列

如何判断数据区分度较高,可使用SELECT COUNT(DISTINCT 某列)/COUNT(*)FROM (table_name)进行计算,越接近1即表明该列的唯一性越强,就越适合添加索引;

八、使用字符串前缀创建索引

举个栗子:CREATE TABLE SCHOOL (ADDRESS VARCHAR(100) NOT NULL) 

在SCHOOL表上可以创建全文索引(FULLTEXT)亦可创建前缀索引(即截取字符串的前N个字节进行匹配),全文索引的特点是覆盖面广,能够通过一系列操作对整段文本进行索引,缺点是效率不如前缀索引高;前缀索引因为只截取了字符串的前N个字节,它的整体结构比较简洁,查询速度快,效率高,缺点是会存在字节部分重复或完全相同的情况;这时我们可通过再次回表,通过判断主键等方式进行查询,避免发生重复或相同的这一情况

那么如何判断截取字符串中的多少字节是最合适的呢?可以使用公式COUNT DISTINCT LEFT(列名,截取的前N个字节长度) / COUNT(*) 进行一个区分度的测试,越接近1,则取对应的那个截取长度值;

九、选择数据类型较小的列

每个字段在建表初期会设置数据类型,那么其中的数据类型也会有大小的差别,如TINYINT,MEDIUMINT,INT,BIGINT等,在不影响该列的数据范围正常显示的情况下,我们优先设置更小的那个数据类型,这样可以让我们能够在一个页中放下更多的数据,从而减少索引时I/O的次数;

总的而言,个人在第七、第八条的理解上可能还有很大的进步空间,请各位老师能多多指点我,指出我理解的不足之处!十分感谢!!!

你可能感兴趣的:(mysql,学习,笔记)