什么是索引?
索引是存储引擎快速找到记录的一种数据结构,也可说就是数据的目录。索引文件以B-Tree格式保存
索引的作用?
1.索引能加快数据的检索查找,也能加快数据的分组和排序;
2.索引能保证数据的唯一性
3.索引能加快关系表的连接速度
索引的缺点?
1.索引的创建和维护需要消耗时间,且随索引量的增加而增加
2.索引的创建需要消耗物理空间
3.表中数据进行增删改时,索引也需要动态维护
为什么能够提高查询速度?
主要是顺序查找的效率要比B+tree的结构查找效率低(这个待详细了解)
索引类型?
1.主键索引
primark key 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。注意:一个表只能有一个主键。
2.唯一索引
唯一索引设置的关键字unique 唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
3.普通索引
这是最基本的索引,它没有任何限制。
4.复合索引
即一个索引包含多个列,多用于避免回表查询
5.全文索引
1. -- 1.添加PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`) ;
2. -- 2.添加UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE (`column`);
3. -- 3.添加INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name (`column`);
4. -- 4.添加FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT (`column`);
5. -- 5.添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`);
索引一经创建不能修改,如果要修改索引,只能删除重建。可以使用DROP INDEX index_name ON table_name;删除索引。
重点
为什么在单列索引的基础上还需要组合索引?
因为在不建立组合索引的前提下 mysql只会用到其中一个最有效率的索引 ,效率平庸
组合索引的最左原则是什么?
组合索引usernname,city,age,其实是相当于分别建立了下面三组组合索引:
1.usernname,city,age ;2.usernname,city;3.usernname
为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:
SELECT * FROM mytable WHREE username="admin" AND city="郑州"SELECT * FROM mytable WHREE username="admin"
而下面几个则不会用到:
SELECT * FROM mytable WHREE age=20 AND city="郑州"SELECT * FROM mytable WHREE city="郑州"
创建索引的原则:
最左原则
基数小的表最好不要建立索引
尽量选择区分度高的列作为索引
尽量的扩展索引,不要新建索引。
为经常需要作为查询条件、排序、分组和联合操作的字段建立索引
限制索引的数目,不要盲目创建索引
尽量使用数据量少的索引,使用前缀做索引
删除不再使用或者很少使用的索引
关于索引的优化:
避免在索引列上使用计算
避免在索引列上使用not
避免在索引列上使用is null 和is not null
遵守索引的最左原则
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
模糊查询不能前置百分号,否则导致全表扫描
where 子句中使用 or 来连接条件 将导致引擎放弃使用索引而进行全表扫描
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引
以上是有关索引的知识点的详细内容。更多信息请关注PHP中文网其他相关文章!