设为首页 加入收藏

TOP

MySQL索引及高级用法(二)
2015-11-21 02:07:08 来源: 作者: 【 】 浏览:3
Tags:MySQL 索引 高级 用法
-- 此处 indexName 索引名同样可以省略 /* (2)唯一索引,它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式(仅仅在创建普通索引时关键字 INDEX 前加 UNIQUE): */ -- 创建索引 CREATE UNIQUE INDEX indexName ON mytable(username(10)); -- 修改表结构来创建索引 ALTER TABLE mytable ADD UNIQUE INDEX indexName (username(10));-- 也可简写成 ALTER TABLE mytable ADD UNIQUE indexName (username(10)); -- 创建表的时候直接指定 CREATE TABLE mytable( id INT, username VARCHAR(16), city VARCHAR(16), age INT, UNIQUE INDEX indexName (username(10)) -- 也可简写成 UNIQUE indexName (username(10)) ); /* (3)主键索引,它是一种特殊的唯一索引,不允许有空值。在建表的时候同时创建的主键即为主键索引 主键索引无需命名,一个表只能有一个主键。主键索引同时可是唯一索引或者全文索引,但唯一索引或全文索引不能共存在同一索引 */ -- 修改表结构来创建索引 ALTER TABLE mytable ADD PRIMARY KEY (id); -- 创建表的时候直接指定 CREATE TABLE mytable( id INT, username VARCHAR(16), city VARCHAR(16), age INT, PRIMARY KEY(id) ); /* (4)全文索引,InnoDB存储引擎不支持全文索引 */ -- 创建索引 CREATE FULLTEXT INDEX indexName ON mytable(username(10)); -- 修改表结构来创建索引 ALTER TABLE mytable ADD FULLTEXT INDEX indexName (username(10));-- 也可简写成 ALTER TABLE mytable ADD FULLTEXT indexName (username(10)); -- 创建表的时候直接指定 CREATE TABLE mytable( id INT, username VARCHAR(16), city VARCHAR(16), age INT, FULLTEXT INDEX indexName (username(10)) -- 也可简写成 FULLTEXT indexName (username(10)) )ENGINE=MYISAM; -- 建表时创建全文索引,要设置该表的存储引擎为MYISAM,新版mysql默认InnoDB存储引擎不支持全文索引 -- 删除索引 DROP INDEX indexName ON mytable; /* Mysql自动使用索引规则: btree索引 当使用 <,<=,=,>=,>,BETWEEN,IN,!=或者<>,以及某些时候的LIKE才会使用btree索引,因为在以通配符%和_开头作查询时,MySQL不会使用索引。btree索引能用于加速ORDER BY操作 hash索引 当使用=,<=>,IN,IS NULL或者IS NOT NULL操作符时才会使用hash索引,并且不能用于加速ORDER BY操作,并且条件值必须是索引列查找某行该列的整个值 对where后边条件为字符串的一定要加引号,字符串如果为数字mysql会自动转为字符串,但是不使用索引。 mysql目前不支持函数索引,只能对列的前一部分(指定长度前缀)进行索引,对于char和varchar列,使用前缀索引(该列从起始字符到指定长度字符位置建立索引)将大大节省空间。 mysql列建议列是非null的。说是如果是允许null的列,对索引会有影响(索引不会包括有NULL值)。因为它们使得索引、索引的统计信息以及比较运算更加复杂。应该用0、一个特殊的值或者一个空串代替空值。 尽量不使用NOT IN和<>操作 username,city,age建立这三列的组合索引,其实是相当于分别建立了下面三组组合索引: username,city,age username,city username 使用组合索引,比如where等条件,列名必须从组合索引最左列至右连续的列名做条件才可以,组合索引类似单一索引前缀 */ -- 调用组合索引 SELECT * FROM mytable WHERE username = 'admin' AND city = 'DaLian'; -- 多表联查中的条件也可运用索引 -- 全文索引的使用 SELECT * , MATCH (username,city) AGAINST ('name100 name200 city500 thisisname') FROM mytable WHERE MATCH (username,city) AGAINST ('name100 name200 city500 thisisname'); -- 返回 mytable 表在 MATCH 的参数中的任意列中包含 AGAINST 字符串参数中被 "空格" "," 和 "." 分割的任意单词的行(断字的字符: "空格" "," 和 "." 但是不用这些符号断字的语言,如中文,就得自行手动断字。) -- 表列中的单词也是以空格分割来区分 -- 这里指定 MATCH...AGAINST 两次。这不会引起附加的开销,因为 MySQL 优化器会注意到两次是同样的 MATCH...AGAINST 调用,并只调用一次全文搜索代码。 /* 函数 MATCH() 对照一个列名集(一个 FULLTEXT 索引中的一个或多个列的列名)。搜索字符串做为 AGAINST() 的参数给定。搜索以忽略字母大小写的方式执行,预设搜寻是不分大小写,若要分大小写,列的字符集设置要从utf8改成utf8_bin。 虽然同一个表格可以有不同字符集的字段,但是同一个FULLTEXT 索引里的字段必须是同一个字符集与collation。 任何在 stopword 列表上出现的,或太短的(3 个字符或更少的)的单词将被忽略。(可以覆写内建的 stopword 列表。可以修改最少四个字符的设定。 ) 搜索的词有一个权重性,如果搜索的词在表中包含它的行太多,则这个搜索词将有较低的权重(可能甚至有一个零权重),否则,它将得到一个较高的权重。然后,权重将被结合用于计算行的相似性。 如果搜索词在表中超过一半的行中出现。则它被有效地处理为一个 stopword (即,一个零语义值的词),不搜索该词。 MATCH...AGAINST可以跟所有MySQL语法搭配使用,像是JOIN或是加上其他过滤条件。 对于表中的每行记录,MATCH...AGAINST 返回一个相关性值。即,返回的每行与搜索条件之间的相似性尺度。 当 MATCH() 被使用在一个 WHER
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇plsql 下一篇Oracle expdp为什么比exp快,原理..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: