标签:有一个 day 数值 效率 取数据 因此 图片 itme sql查询语句
索引的的创建跟存储的引擎是挂钩的,存储引擎表示不同数据在不同磁盘的不同组织形式。
聚簇索引与非聚簇索引:取决于数据与索引是否是放在一起的。
例如InnoDb就是只能有一个聚簇索引但可以有很多非聚簇索引(向InnoDb插入数据的时候必须要包含一个索引的key值,而且你创建表的时候如果不设置索引,索引的key值可以是主键,这也就是你平时创建表的时候为什么最好设置一个id字段,并且设置为主键自增。如果也没有主键的话,会使用唯一键作为索引,如果还没有唯一键的话,就会自生成一个,不同的数据库不同,但生成的这个是不可见的)
回表:
索引覆盖:
组合索引(最左匹配):
平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示
–使用到上面的索引 SELECT * FROM article WHREE title=’测试’ AND time=1234567890; SELECT * FROM article WHREE title=’测试’; –不使用上面的索引 SELECT * FROM article WHREE time=1234567890;
索引下推(了解即可):
首先来说一下索引使用是的小技巧:
1.索引不会包含有NULL的列
只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。
2.使用短索引
对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。
4.like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。
5.不要在列上进行运算
6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
7.索引要建立在经常进行select操作的字段上。
这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
8.索引要建立在值比较唯一的字段上。
9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。
10.在where和join中出现的列需要建立索引。
11.where的查询条件里有不等号(where column != …),mysql将无法使用索引。
12.如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。
13.在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。
标签:有一个 day 数值 效率 取数据 因此 图片 itme sql查询语句
原文地址:https://www.cnblogs.com/moxihuishou/p/14060653.html