如何创建索引?为什么索引查询不一定能提高查询的性能?什么情况下索引失效?

(1)如何创建索引?创建索引时需要注意什么?创建索引的原则有哪些?

创建索引有三种方式

1、在执行CREATE TABLE时创建索引(主键索引、联合索引、全文索引、唯一索引)

CREATE TABLE user_index2 (
    id INT auto_increment PRIMARY KEY,
    first_name VARCHAR (16),
    last_name VARCHAR (16),
    id_card VARCHAR (18),
    information text,
    KEY name (first_name, last_name),
    FULLTEXT KEY (information),
    UNIQUE KEY (id_card)
);

2、使用ALTER TABLE命令去增加索引

ALTER TABLE table_name ADD INDEX index_name (column_list);

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。其中table_name表名,index_name索引名,column_list组成索引的列名。

3、使用CREATE INDEX命令创建

CREATE INDEX index_name ON table_name (column_list);

注意事项

非空字段:指定列为NOT NULL。因为含有空值的列很难进行查询优化。

索引字段越小越好:数据库的数据存储以页为单位,一页存储的数据越多,一次IO操作获取的数据越多,效率越高。

创建索引的原则

1、最左前缀匹配原则。

2、尽量选择区分度高的列作为索引,如果结果接近1,意味着几乎每一条记录在这个字段上的值都不一样,这样的字段作为索引效果很好,因为可以准确地区分每一条记录。

3、索引列不应该直接参与计算或函数调用,否则数据库无法利用索引快速定位数据,查询性能会受到影响。

(2)为什么索引查询一定能提高查询的性能

通过索引查询数据通常比全表扫描要快得多,这是因为索引实质上是,按照某种规则预先排序的数据结构(如B+树),这使得数据库系统能够快速定位到符合条件的数据行。

使用索引代价

存储空间:索引需要额外的磁盘空间来存储索引结构。

维护成本:每次对表进行INSERT、DELETE或UPDATE操作时,如果涉及到索引列,那么相应的索引也必须同步更新,会引发多次磁盘I/O操作,资源开销可能大于全表扫描。

索引使用范围

基于一个范围的检索,且预计查询结果集大小远小于表中总记录数的30%左右。

基于索引值是重复的检索:比如查找满足索引值=1的一批记录。

(3)什么情况下索引失效

1、使用 != 导致索引失效

2、类型不一致导致的索引失效

3、使用运算符对索引进行计算或者在索引列使用函数导致的索引失效

4、OR引起的索引失效

SELECT * FROM `user` WHERE `name` = '张三' OR height = '175';

不是所有的OR都是使索引失效,如果OR连接的是同一个字段,那么索引不会失效。

5、模糊搜索导致的索引失效

SELECT * FROM `user` WHERE `name` LIKE '%';

当 % 放在匹配字段前是不走索引的,放在后面才会走索引。

6、NOT IN、NOT EXISTS导致索引失效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值