(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导致索引失效