//第一种方式:
//在执行CREATE TABLE 时创建索引:(硬设一个id索引)
CREATE TABLE `black_list` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`black_user_id` BIGINT(20) NULL DEFAULT NULL,
`user_id` BIGINT(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
INDEX indexName (black_user_id(length))
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
12345678910111213 第二种方式:使用ALTER TABLE命令去增加索引: ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。//标准语句:
ALTER TABLE table_name ADD INDEX index_name (column_list)//添加普通索引,索引值可出现多次。
ALTER TABLE table_name ADD UNIQUE (column_list)//这条语句创建的索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE table_name ADD PRIMARY KEY (column_list)//该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE table_name ADD FULLTEXT index_name(olumu_name);该语句指定了索引为FULLTEXT,用于全文索引。
//针对上述数据库,增加商品分类的索引
ALTER table commodity_list ADD INDEX classify_index (Classify_Description)
123456789 其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可自己命名,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。 第三种方式:使用CREATE INDEX命令创建 CREATE INDEX可对表增加普通索引或UNIQUE索引。//标准语句:
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
//针对上述数据库:
CREATE INDEX classify_index ON commodity_list (Classify_Description)
12345 table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。 二】删除索引: 删除索引可以使用ALTER TABLE或DROP INDEX语句来实现。DROP INDEX可以在ALTER TABLE内部作为一条语句处理,其格式如下:DROP INDEX [indexName] ON [table_name];
alter table [table_name] drop index [index_name] ;
alter table [table_name] drop primary key ;
//针对上述数据库
drop index classify_index on commodity_list ;
12345 其中,在前面的两条语句中,都删除了table_name中的索引index_name。而在最后一条语句中,只在删除PRIMARY KEY索引中使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。 如果从表中删除某列,则索引会受影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。 三】查看索引:SHOW INDEX FROM [table_name];
show keys from [table_name];
12//标准语句:
ALTER TABLE table_name ADD INDEX index_name (column_list)
CREATE INDEX index_name ON table_name (column_list);
//还有建表的时候创建亦可
CREATE TABLE table_name (
ID INT NOT NULL,
column_listVARCHAR(16) NOT NULL,
INDEX [index_name ]
(column_list(length))
);
1234567891011 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。 例子:假如length为10,也就是索引这个字段的记录的前10个字符。 二)唯一索引: 与前面的普通索引类似,不同的就是:MySQL数据库索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 它有以下几种创建方式:ALTER TABLE table_name ADD UNIQUE (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
//还有建表时创建
CREATE TABLE table_name (
ID INT NOT NULL,
column_list VARCHAR(16) NOT NULL,
UNIQUE [index_name ]
(column_list(length))
);
12345678910 三)主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE table_name (
ID INT NOT NULL,
[column] VARCHAR(16) NOT NULL,
PRIMARY KEY(ID)
);
12345 四)全文索引:(FULLTEXT) 定义: 全文检索是对大数据文本进行索引,在建立的索引中对要查找的单词进行进行搜索,定位哪些文本数据包括要搜索的单词。因此,全文检索的全部工作就是建立索引和在索引中搜索定位,所有的工作都是围绕这两个来进行的。 此索引关键: 建立全文索引中有两项非常重要,一个是如何对文本进行分词,一是建立索引的数据结构。分词的方法基本上是二元分词法、最大匹配法和统计方法。索引的数据结构基本上采用倒排索引的结构。分词的好坏关系到查询的准确程度和生成的索引的大小。 应用: FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。 但是要注意:对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。因为!!插入修改删除表的同时也要针对索引做一系列的处理。 创建方法://针对content做了全文索引:
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
);
12345678 SQL使用全文索引的方法:首先必须是MyISAM的数据库引擎的数据表 如果是其他数据引擎,则全文索引不会生效。SELECT * FROM article WHERE MATCH( content) AGAINST('想查询的字符串') 1 此外,MySQL自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。 注意: 目前,使用MySQL自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySQL全文索引所能找到的词的默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。 如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。 五)单列索引与多列索引(其实是相当于一个用法技巧) 单列索引,就是平常的只索引一个一个的字段的方式
//例子为name列的头10个字符创建一个索引:
CREATE TABLE test (
name CHAR(200) NOT NULL,
KEY index_name (name(10))
);
12345 多列索引(也叫组合索引): 相关概念(适用多列索引的原因): MySQL能在多个列上创建索引。一个索引可以由最多15个列组成。(在CHAR和VARCHAR列上,你也可以使用列的前缀作为一个索引的部分)。 一个多重列索引可以认为是包含通过合并(concatenate)索引列值创建的值的一个排序数组。 多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个单列索引中选择一个限制最为严格(获得结果集记录数最少)的索引。 当你为在一个WHERE子句索引的第一列指定已知的数量时,MySQL以这种方式使用多重列索引使得查询非常快速,即使你不为其他列指定值。 适用场景: 1.全字段匹配 2.匹配部分最左前缀 3.匹配第一列 4.匹配第一列范围查询(可用用like a%,但不能使用like %b) 5.精确匹配某一列和和范围匹配另外一列 例子://假设只使用单列索引名字
ALTER TABLE people ADD INDEX name (name);
//使用多列索引:
ALTER TABLE people ADD INDEX height_name_age (height,name,age);
//相当于创建了(height)单列索引,(height,name)组合索引以及(height,name,age)组合索引
123456789 注意: 在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。 组合索引(多列索引)的原则: 原则: 最左前缀:顾名思义,就是最左优先 平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引(多列索引)。例如上面使用的例子就相当于创建了(height)单列索引,(height,name)组合索引以及(height,name,age)组合索引。 此外,补充一个概念对比,那就是聚集索引和非聚集索引: 1)聚集索引:相关概念说法取自此处 定义: 该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。 注意事项: 定义聚集索引键时使用的列越少越好。 使用的场景: 一)包含大量非重复值的列。 二)使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。 三)被连续访问的列。 四)返回大型结果集的查询。 五)经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。 六)OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。 缺点:请看此博客 不适用于: 频繁更改的列 。这将导致整行移动(因为 SQL Server 必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。 宽键 。来自聚集索引的键值由所有非聚集索引作为查找键使用,因此存储在每个非聚集索引的叶条目内。 2)非聚集索引: 定义: 数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。 非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引,因为这是读者查找信息的两种最常用的方法。 两者的区别此处有个很清晰的例子:请点此处 选择使用的场景:select id from t where num is null 1 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库. 备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。 不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: 三、)应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。 四、)应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num=10 or Name = 'fuzhu' 1 可以这样查询,充分利用索引:
select id from t where num = 10
union all
select id from t where Name = 'fuzhu'
123 五、)in 和 not in 也要慎用,否则会导致全表扫描。select id from t where num in(1,2,3) 1 对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3 12 很多时候用 exists 代替 in 是一个好的选择
select num from a where num in(select num from b)
12 正上面的,用下面的语句替换:select num from a where exists(select 1 from b where num=a.num) 12 六、)下面的模糊查询也将导致全表扫描:
select id from t where name like ‘%abc%’ 12 一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引,而like “aaa%”可以使用索引。 若要提高效率,可以考虑全文检索。 既然谈到模糊查询下使用索引,我们就顺便详细地讲讲吧。 1. like %keyword 索引失效,使用全表扫描。但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描。例子在此处 2. like keyword% 索引有效。 3. like %keyword% 索引失效,也无法使用反向索引。
//可以拿我给出的数据库试一下嘛。然后用explain测试,就能测出有没有走索引了
select * from table where code like 'Classify_Description%'
select * from table where code like '%Classify_Description%'
select * from table where code like '%Classify_Description'
1234 七、)如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:select id from t where num = @num 1 可以改为强制查询使用索引:
select id from t with(index(索引名)) where num = @num 1 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2 = 100 12 正上面的应改为:
select id from t where num = 100*2 12 八、)应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3) = ’abc’
select id from t where datediff(day,createdate,’2005-11-30′) = 0 -–‘2005-11-30’
12 应改为:select id from t where name like 'abc%'
select id from t where createdate >= '2005-11-30' and createdate < '2005-12-1'
12 九、).不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 十、)在使用索引字段作为条件时,如果该索引是复合索引(多列索引),那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。 十一、)索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。 十二、)应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。 十三、)尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。 十四、)MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。相关知识
MySQL优化系列(三)
MySQL优化之索引优化
mysql从表中获取用户最高出价
使用Python调用mysql
Php网上鲜花售卖网站论文,基于PHP的花卉销售网站的设计与实现(MySQL)(含录像)
计算机毕业设计django基于python鲜花培育专家系统 (源码+系统+mysql数据库+Lw文档)
用Python做兼职,轻松赚取零花钱,分享Python兼职经验
关于mysql字符串的存储之char,varchar类型
SSM开心鲜花系统5o1dr 虚拟支付
栾川县三川镇:“三篇文章”一起做 开拓山区致富路
网址: MySQL优化系列(三) https://m.huajiangbk.com/newsview104793.html
上一篇: 生态学实验方案范文 |
下一篇: 大学计算机实验报告范文 |