[数据库]索引的建立
2016-06-02 20:59
330 查看
由于没有学过数据库这门课,所以使用的时候很多概念都不知道,前段时间学长让我学习一下索引相关的知识,因为面试的时候会经常问道,而且当时项目也确实用到了这个问题,在此简单记录一下,以后再慢慢学习慢慢整理。
我理解的数据库索引就是用空间换取时间,如果没有索引,查找数据库中某个字段的时候就会进行顺序查找直到找到符合条件的数据,如果数据量非常庞大的话,这个开销肯定是非常恐怖的,所以在某个经常进行查找排序等操作的字段上建立索引,一般都是B树或者哈希索引,这样会额外建立一个数据结构以使得改字段呈某种规律被持有,在查找的时候就能快速被找到,但是这个额外的数据结构肯定也需要维护。以上完全是个人理解,不一定保证正确。
一、基本操作
1、查看索引
![](https://img-blog.csdn.net/20160602211123968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
关于各个参数的意义有详细的介绍:(参考地址:点击打开链接)
· Table
表的名称。
· Non_unique
如果索引不能包括重复词,则为0。如果可以,则为1。
· Key_name
索引的名称。
· Seq_in_index
索引中的列序列号,从1开始。
· Column_name
列名称。
· Collation
列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
· Cardinality
索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。
· Sub_part
如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
· Packed
指示关键字如何被压缩。如果没有被压缩,则为NULL。
· Null
如果列含有NULL,则含有YES。如果没有,则该列含有NO。
· Index_type
用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
2、建立索引
· index_name表示索引的名称,就是上面说到的Key_name。
· table表示列所在的表,对应上面的Table。
·
column表示列名称,对应上面的Column_name。
![](https://img-blog.csdn.net/20160602213427523?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
刚开始的时候每次创建索引都会导致数据库直接崩溃,可能是因为主机没有配置环境变量,后来在主机配置环境变量后,就创建成功了。
3、删除索引
· index_name表示索引的名称,就是上面说到的Key_name。
· table表示列所在的表,对应上面的Table。
![](https://img-blog.csdn.net/20160602213612836?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我理解的数据库索引就是用空间换取时间,如果没有索引,查找数据库中某个字段的时候就会进行顺序查找直到找到符合条件的数据,如果数据量非常庞大的话,这个开销肯定是非常恐怖的,所以在某个经常进行查找排序等操作的字段上建立索引,一般都是B树或者哈希索引,这样会额外建立一个数据结构以使得改字段呈某种规律被持有,在查找的时候就能快速被找到,但是这个额外的数据结构肯定也需要维护。以上完全是个人理解,不一定保证正确。
一、基本操作
1、查看索引
mysql> show index from tblname;其中的tbname为表的名称,比如我的数据库中news_table是一个用于存储新闻的表,其中的新闻地址会经常被查找,所以在该字段建立了索引,使用上述命令就可以看见在news_table中有几个索引,还可以看出索引的类型,下面显示的是BTREE。
关于各个参数的意义有详细的介绍:(参考地址:点击打开链接)
· Table
表的名称。
· Non_unique
如果索引不能包括重复词,则为0。如果可以,则为1。
· Key_name
索引的名称。
· Seq_in_index
索引中的列序列号,从1开始。
· Column_name
列名称。
· Collation
列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
· Cardinality
索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。
· Sub_part
如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
· Packed
指示关键字如何被压缩。如果没有被压缩,则为NULL。
· Null
如果列含有NULL,则含有YES。如果没有,则该列含有NO。
· Index_type
用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
2、建立索引
CREATE INDEX index_name ON table(column(length))由于接触的不是很深入,我直接创建了索引,没有指定length。
· index_name表示索引的名称,就是上面说到的Key_name。
· table表示列所在的表,对应上面的Table。
·
column表示列名称,对应上面的Column_name。
CREATE INDEX address_index ON news_table(news_address);
刚开始的时候每次创建索引都会导致数据库直接崩溃,可能是因为主机没有配置环境变量,后来在主机配置环境变量后,就创建成功了。
3、删除索引
DROP INDEX index_name ON table
· index_name表示索引的名称,就是上面说到的Key_name。
· table表示列所在的表,对应上面的Table。
DROP INDEX address_index ON news_table;
相关文章推荐
- Mysql性能优化一
- SQL必知必会(第3版)学习笔记【1-5章】
- mysql ERROR 1045 (28000): Access denied for user解决方法
- 解决重新安装sqlserver2008报错Reporting Services目录数据库文件存在的问题
- 解决重新安装sqlserver2008报错Reporting Services目录数据库文件存在的问题
- 拆书——SQL Server从入门到精通 (1)
- 准确计算oracle表分区记录数
- 微软发布正式版SQL Server 2016
- 完整java开发中JDBC连接数据库代码和步骤
- 数据库中的索引
- MySQL5.7修改数据库目录!
- MySQL5.7修改数据库目录!
- hive高阶1--sql和hive语句执行顺序、explain查看执行计划、group by生成MR
- hive高阶1--sql和hive语句执行顺序、explain查看执行计划、group by生成MR
- MySQL远程登录设置
- oracle 导出导入不含数据的空库
- oracle 导出导入不含数据的空库
- mysql update语句 无法实现数据库更改操作
- mysql 批量插入数据
- Windows Redis3 安装