建立索引
建立索引是优化查询的一种方式,我们通常会对where列上建立相关索引,可以是单列的索引,也可以是复合索引。
加索引要注意
在where、order by的相关列上可以考虑添加索引;
如果where列中已经存在索引,order by列的索引(假设存在)不会被利用(explain显示using filesort就表示order by没有用到索引,where列与order by列建立复合索引,就可以了,也可以在业务层进行排序);
where列中多个“且”条件列都添加了索引,mysql只会利用“价值最大”的一列(这种情况可以考虑复合索引);
复合索引的最前匹配原则;
字符串列的索引,“abc%”会走索引,“%abc”不会走索引;
为字符串建立索引,最好遵循短索引,比如一个CHAR(255)的列,如果该列值的前10位就可保证唯一(或者区分度很高,近似唯一),就可以以前10为建立索引;
尽量避免使用否定条件,如NOT IN、IS NOT、NOT LIKE、!=、<>等(否定句不走索引);
理解以上一系列的规则并不困难,比如说多个“且”条件只会利用一个索引,而多个“或”条件则可能会利用多个索引。因为对于“且”条件,使用一个索引找到相关数据项后只需要在这些数据项中进一步条件过滤就可以了,没有必要再次通过索引做任何事,而对于“或”条件,一个索引找到的条目可能并不满足其他条件,这就需要多次经过索引进行查找(当然也并非一定会经过索引查找,mysql会做出“明智”的决定)。
NULL值的索引
网上对where name is null这种查询走不走索引说法不一,有些观点说不走索引,推荐将列均设为NOT NULL,将null值替换为0、""等形式。但我从官方文档找到了相关说明,并且也做了相应测试,NULL列确实可以走索引。
MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value. For example, MySQL can use indexes and ranges to search for NULL with IS NULL.
Examples
1 SELECT * FROM tbl_name WHERE key_col IS NULL; 2 3 SELECT * FROM tbl_name WHERE key_col <=> NULL; 4 5 SELECT * FROM tbl_name 6 WHERE key_col=const1 OR key_col=const2 OR key_col IS NULL;
附:可以通过explain查看查询是否使用了索引;
通过show profiles可以查看查询耗时,show profile for query n可以查询某条查询语句的详细执行情况。数据库默认是不开启profiling的,变量profiling是用户变量,每次都得通过set profiling=1;重新启用,可以通过set profiling=0关闭。
1.添加PRIMARY KEY(主键,聚簇索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(unique表示该字段的值唯一,这种约束需要通过建立唯一索引实现的,所以这里会建立唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(显示建立普通索引) mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4.添加FULLTEXT(全文索引) mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 5.添加多列索引 mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` ) 6.添加前缀索引,n表示前缀长度 mysql>ALTER TABLE `table_name` ADD KEY(column1, column2(n))