A、索引的基本操做mysql
1、概念算法
1)、查看索引 show index from 数据库表名 sql
2)、alter table 数据库表 add index 索引名称(数据库表字段名称)数据库
2、索引类型:性能优化
1)、PRIMARY KEY(主键索引) 数据结构
ALTER TABLE table_name ADD PRIMARY KEY ( column )函数
2)、UNIQUE(惟一索引) 性能
ALTER TABLE table_name ADD UNIQUE (column)大数据
3)、INDEX(普通索引) 优化
ALTER TABLE table_name ADD INDEX index_name ( column )
4)、FULLTEXT(全文索引)
ALTER TABLE table_name ADD FULLTEXT ( column )
5)、多列索引
ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )
3、操做
1).普通索引。
这是最基本的索引,它没有任何限制。它有如下几种建立方式:
(1)建立索引:
CREATE INDEX indexName ON tableName(tableColumns(length));
若是是CHAR,VARCHAR类型,length能够小于字段实际长度;若是是BLOB 和 TEXT 类型,必须指定length,下同。
(2)修改表结构:
ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)建立表的时候直接指定:
CREATE TABLE tableName ( […], INDEX [indexName] (tableColumns(length)) ;
2).惟一索引。
它与前面的”普通索引”相似,不一样的就是:索引列的值必须惟一,但容许有空值。若是是组合索引,则列值的组合必须惟一。它有如下几种建立方式:
(1)建立索引:
CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表结构:
ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)建立表的时候直接指定:
CREATE TABLE tableName ( […], UNIQUE [indexName] (tableColumns(length));
3).主键索引
它是一种特殊的惟一索引,不容许有空值。通常是在建表的时候同时建立主键索引:
CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 固然也能够用ALTER命令。
B、索引的原理及案例
如图所示,若是要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找肯定29在17和35之间,锁定磁盘块1的P2指针,内存时间由于很是短(相比磁盘的IO)能够忽略不计,经过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,经过指针加载磁盘块8到内存,发生第三次IO,同时内存中作二分查找找到29,结束查询,总计三次IO。真实的状况是,3层的B-tree能够表示上百万的数据,若是上百万的数据查找只须要三次IO,性能提升将是巨大的,若是没有索引,每一个数据项都要发生一次IO,那么总共须要百万次的IO,显然成本很是很是高。
注意:B-tree的高度通常都在2-4层,这也就是说查找某一键值的行记录最多只要2到4次IO,花费0.02-0.04秒左右。B-tree索引适用于全值匹配、匹配最左前缀、匹配列前缀、匹配范围值
数据表以下,
数据量:
咱们经过explain查看执行计划
首先咱们在没有添加索引时,进行以下查询。咱们能够看出type=all代表全表扫描,估计查询行数为4070行。
咱们经过explain查看执行计划
首先咱们在没有添加索引时,进行以下查询。咱们能够看出type=all代表全表扫描,估计查询行数为4070行。
如今咱们添加索引以下,
在经过explain查询执行计划,咱们发现该查询的行数估计为1行。
Mysql中只有在memory引擎显示支持哈希索引。
哈希索引基于哈希表实现,只有精确匹配索引全部列的列才有效。 对于每一行数据,存储引擎都会对全部索引计算一个哈希码,哈希码是一个较小的值而且不一样键值计算出来的哈希码都不同。哈希索引将全部的哈希码存储在索引中,同时在哈希表中保存指向每一个数据的指针。
哈希索引的限制:
注意:Innodb引擎有一个特殊的功能叫作“自适应哈希索引”。当Innodb注意到某些索引值使用很是频繁时,它会在内存中基于B-tree索引之上再创建一个哈希索引。这是一个彻底自动、内部的行为,用户没法配置或者设置,不过有必要能够关闭此功能。
思路:在B-tree基础上建立一个伪哈希索引。这和真正的哈希索引不是一回事,它使用哈希值而不是键自己经行查找。须要在操做中在where语句中手动指定哈希函数。
其中,url_crc用来存储哈希值。该值根据url和哈希函数得出。
咱们经过触发器来实现维护哈希值。
若是采用这种方式,记住不要使用SHA1()和MD5()做为哈希函数。由于这两个值计算出来的哈希值是很是长的字符串,会浪费大量时间,比较时也会比较慢。
在出现哈希冲突时,必须在子句中包含常量值。
与普通索引相似,不一样的就是:索引列的值必须惟一,但容许有空值(注意和主键不一样)。若是是组合索引,则列值的组合必须惟一。
例如,在已经存好数据的表中添加惟一索引,若是值有重复会报错,
它是一种特殊的惟一索引,不容许有空值。
平时用的SQL查询语句通常都有比较多的限制条件,因此为了进一步榨取MySQL的效率,就要考虑创建组合索引。
至关于同时建立了三个索引,
(ConutryCode,District,Name),(CountryCode,District),(CountryCode)。
这是由于从最左开始组合的。因此依次生成了三个索引。
在前面描述中,在B-tree中能够经过列前缀进行查询。例如
select * from testwhere body=”hello%”;
然而,咱们更广泛的查找方式是,
select * from testwhere body=”%hello%”;
全文索引能够支持各类字符在内的搜索,也支持天然语言搜索和布尔搜索。
注意,在innodb存储引擎中为了支持全文索引,必须有一列与word经行映射。在Innodb中这个列别命名为FTS_DOC_ID,其类型必须是BIGINT UNSIGNED NOT NULL,而且innodb存储引擎自动会在该列上加入一个名为FTS_DOC_ID_INDEX的unique index。上述操做都是由Innodb存储引擎本身完成的,用户也可在建表时手动添加FTS_DOC_ID以及相应的Unique idnex。
mysql> create fulltext index idx on fts(body);
能够看出每个word都对应一个DOC_ID和POSITION。此外还记录了FIRST_ID,LAST_DOC_ID以及DOC_COUNT,分别表明了word第一次出现的文档ID,最后一次出现的文档ID,以及word在在多少个文档中存在。
天然语言索引引擎将计算每个文档对象和查询的相关度。这里,相关度是指基于匹配的关键词个数,以及关键词在文档中出现的个数。
天然语言索引是默认的。
函数match()将返回关键词匹配的相关度,是一个浮点数字。
在match()中指定的列必须和全文索引中指定的列彻底相同,不然没法只用全文索引。
举例子,
Mysql数据库容许使用in boolen model修饰符来经行全文检索。当使用该修饰符时,查询字符串先后字符会有特殊含义。
Boolen全文检索支持如下几种操做符:
l +:表示word必须存在
l -:表示word必须不存在
l (no operator) 表示word是可选的。可是若是是可选的,其相关性会更高。
l @distance表示查询的多个单词之间的距离是否在distance以内。
2 rows in set(0.00 sec)
l >表示出现该word增长相关性
l <表示出现该word下降相关性
l ~容许出现该单词,可是出现时相关性为负。
l 表示以该单词开头的单词,如lik,表示能够是like,likes和lik
---------------+2 rows in set(0.00 sec)
l “表示短语
注意到,第一个against(“hello world“)是将hello和world看成两个单词经行查询。而第二个against(‘”hello world“’)是将这两个单词看成短语经行查询。
普通索引:最基本的索引,没有任何限制
惟一索引:与"普通索引"相似,不一样的就是:索引列的值必须惟一,但容许有空值。
主键索引:它是一种特殊的惟一索引,不容许有空值。
全文索引:针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提升mysql效率可创建组合索引,遵循”最左前缀“原则。