Mysql索引命令、优缺点、注意事项

创建表时简历索引

1、建表同时建立单索引

CREATE TABLE t_user1(id INT ,
userName VARCHAR(20),
PASSWORD VARCHAR(20),
INDEX (userName) #关键字INDEX
);

2、建表同时建立唯一索引(可以是单或多)

CREATE TABLE t_user2(id INT ,
userName VARCHAR(20),
PASSWORD VARCHAR(20),
UNIQUE INDEX index_userName(userName) #关键字UNIQUE和INDEX
);

3、建表同时建立联合索引

CREATE TABLE t_user3(id INT ,
userName VARCHAR(20),
PASSWORD VARCHAR(20),
INDEX index_userName_password(userName,PASSWORD)
);

给已存在表添加索引

1、单列索引

CREATE INDEX index_userName ON t_user(userName);

2、唯一索引

CREATE UNIQUE INDEX index_userName ON t_user(userName);

3、联合索引

CREATE INDEX index_userName_password ON t_user(userName,PASSWORD);

另一种写法与上面相似 但是有区别

1、单列索引

ALTER TABLE t_user ADD INDEX index_userName(userName);

2、唯一索引

ALTER TABLE t_user ADD UNIQUE INDEX index_userName(userName);

3、联合索引

两种区别:
    1、CREATE INDEX必须提供索引名,对于ALTER TABLE,将会自动创建,如果你不提供;
    2、CREATE INDEX一个语句一次只能建立一个索引,ALTER TABLE可以在一个语句建立多个,如:
    ALTER TABLE HeadOfState ADD PRIMARY KEY (ID), ADD INDEX (LastName,FirstName);
    3、只有ALTER TABLE 才能创建主键,ADD INDEX 不能;

    ALTER TABLE t_user ADD INDEX index_userName_password(userName,PASSWORD);

删除索引

DROP INDEX index_userName ON t_user;
DROP INDEX index_userName_password ON t_user;

优点

     对于记录数量很多的表,可以提高查询速度。

缺点

     占用空间、影响update insert delete速度。

各种索引的合理使用

    1、首先要确定优化的目标,在什么样的业务场景下,表的大小等等。如果表比较小的话,可能都不需要加索引。
    2、哪些字段可以建索引? 一般都where、order by 或者 group by 后面的字段。
    3、记录修改的时候需要维护索引,所以会有开销,要衡量建索引之后的得与失(空间+维护换时间)。
    4、比如学生表,可以认为name的重复度比较小,而age的重复度比较大,对于单列索引来说,比较适合建在重读度低的列上。
    5、对于select from students where name='张三’and age=18;该中情况下:
        A. name 和 age 各自单独建立索引:
        一般来说mysql会选择其中一个索引,name的可能性比较大,因为mysq会统计每个索引上的重复度,选用低重复度的字段。所以不使用age,否则增加太多成本。
        B. name和age的联合索引:
        这种索引的切合度最好。但是相对单索引来说,维护的成本大,索引数据占用的存储空间也要更大。
可是!有必要使用联合索引吗?一般没必要:学校有10000个学生,叫谢春花的会超过5个吗?5个找一个比建立联合索引花销小的多。
    6、什么情况下使用联合索引比较好呢? 举一个例子,大学修课,需要创建一个关系对应表,有2个字段,student_id 和 teacher_id,想要查询某个老师和某个学生是否存在师生关系。
        一个学生会选50老师,一个老师会带200个学生
        如果只为student_id建立索引的情况下,经过索引会选出50条记录,然后在内存中where一下,去除其余的老师。
        相反如果只为teacher_id建立索引,经过索引会选出200条记录,然后在内存中where一下,去除其余的学生。
        两种情况都不是最优的,因为使用索引后范围依然很大,这个时候使用联合索引最合适,通过索引直接找到对应记录,差不多提高了一倍效率。

索引失效场景

    1.WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引
    2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引
    3.在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用
    4.如果WHERE子句的查询条件里使用了比较操作符LIKE和REGEXP,MYSQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE 'abc%',MYSQL将使用索引;如果条件是LIKE '%abc',MYSQL将不使用索引。
    5.在ORDER BY操作中,MYSQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。尽管如此,在涉及多个数据表的查询里,即使有索引可用,那些索引在加快ORDER BY操作方面也没什么作用。
    6.如果某个数据列里包含着许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含了净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。
    7.索引有用的情况下就太多了。基本只要建立了索引,除了上面提到的索引不会使用的情况下之外,其他情况只要是使用在WHERE条件里,ORDER BY 字段,联表字段,一般都是有效的。 建立索引要的就是有效果。 不然还用它干吗? 如果不能确定在某个字段上建立的索引是否有效果,只要实际进行测试下比较下执行时间就知道。
    8.如果条件中有or(并且其中有or的条件是不带索引的),即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
    9.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
    10.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

猜你喜欢

转载自blog.csdn.net/weixin_41850404/article/details/84937043