问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql数据库中怎么创建索引

发布网友 发布时间:2022-04-21 05:55

我来回答

2个回答

懂视网 时间:2022-04-07 23:01

为mysql数据库建立索引

转载:http://www.cnblogs.com/cy163/archive/2008/10/27/1320798.html

  最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。

Code代码如下:
CREATE TABLE mytable (
 id serial primary key,
 category_id int not null default 0,
 user_id int not null default 0,
 adddate int not null default 0
);



  很简单吧,不过对于要说明这个问题,已经足够了。如果你在查询时常用类似以下的语句:

SELECT * FROM mytable WHERE category_id=1; 

  最直接的应对之道,是为category_id建立一个简单的索引:

CREATE INDEX mytable_categoryid 
 ON mytable (category_id);

  OK,搞定?先别高兴,如果你有不止一个选择条件呢?例如:

SELECT * FROM mytable WHERE category_id=1 AND user_id=2;

  你的第一反应可能是,再给user_id建立一个索引。不好,这不是一个最佳的方法。你可以建立多重的索引。

CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);

  注意到我在命名时的习惯了吗?我使用"表名_字段1名_字段2名"的方式。你很快就会知道我为什么这样做了。

  现在你已经为适当的字段建立了索引,不过,还是有点不放心吧,你可能会问,数据库会真正用到这些索引吗?测试一下就OK,对于大多数的数据库来说,这是很容易的,只要使用EXPLAIN命令:

EXPLAIN

 SELECT * FROM mytable 
  WHERE category_id=1 AND user_id=2;

This is what Postgres 7.1 returns (exactly as I expected) 

 NOTICE: QUERY PLAN:

Index Scan using mytable_categoryid_userid on 
  mytable (cost=0.00..2.02 rows=1 width=16)

EXPLAIN

  以上是postgres的数据,可以看到该数据库在查询的时候使用了一个索引(一个好开始),而且它使用的是我创建的第二个索引。看到我上面命名的好处了吧,你马上知道它使用适当的索引了。

  接着,来个稍微复杂一点的,如果有个ORDER BY字句呢?不管你信不信,大多数的数据库在使用order by的时候,都将会从索引中受益。

SELECT * FROM mytable 
  WHERE category_id=1 AND user_id=2
    ORDER BY adddate DESC;

  有点迷惑了吧?很简单,就象为where字句中的字段建立一个索引一样,也为ORDER BY的字句中的字段建立一个索引:

CREATE INDEX mytable_categoryid_userid_adddate
  ON mytable (category_id,user_id,adddate);

  注意: "mytable_categoryid_userid_adddate" 将会被截短为

"mytable_categoryid_userid_addda"

CREATE

  EXPLAIN SELECT * FROM mytable
  WHERE category_id=1 AND user_id=2
   ORDER BY adddate DESC;

 NOTICE: QUERY PLAN:

 Sort (cost=2.03..2.03 rows=1 width=16)
  -> Index Scan using mytable_categoryid_userid_addda 
    on mytable (cost=0.00..2.02 rows=1 width=16)

EXPLAIN

  看看EXPLAIN的输出,好象有点恐怖啊,数据库多做了一个我们没有要求的排序,这下知道性能如何受损了吧,看来我们对于数据库的自身运作是有点过于乐观了,那么,给数据库多一点提示吧。

  为了跳过排序这一步,我们并不需要其它另外的索引,只要将查询语句稍微改一下。这里用的是postgres,我们将给该数据库一个额外的提示--在ORDER BY语句中,加入where语句中的字段。这只是一个技术上的处理,并不是必须的,因为实际上在另外两个字段上,并不会有任何的排序操作,不过如果加入,postgres将会知道哪些是它应该做的。

EXPLAIN SELECT * FROM mytable 
  WHERE category_id=1 AND user_id=2
  ORDER BY category_id DESC,user_id DESC,adddate DESC;

NOTICE: QUERY PLAN:

Index Scan Backward using 
 mytable_categoryid_userid_addda on mytable 
   (cost=0.00..2.02 rows=1 width=16)

EXPLAIN

  现在使用我们料想的索引了,而且它还挺聪明,知道可以从索引后面开始读,从而避免了任何的排序。

  以上说得细了一点,不过如果你的数据库非常巨大,并且每日的页面请求达上百万算,我想你会获益良多的。不过,如果你要做更为复杂的查询呢,例如将多张表结合起来查询,特别是where限制字句中的字段是来自不止一个表格时,应该怎样处理呢?我通常都尽量避免这种做法,因为这样数据库要将各个表中的东西都结合起来,然后再排除那些不合适的行,搞不好开销会很大。

  如果不能避免,你应该查看每张要结合起来的表,并且使用以上的策略来建立索引,然后再用EXPLAIN命令验证一下是否使用了你料想中的索引。如果是的话,就OK。不是的话,你可能要建立临时的表来将他们结合在一起,并且使用适当的索引。

  要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

  以上介绍的只是一些十分基本的东西,其实里面的学问也不少,单凭EXPLAIN我们是不能判定该方法是否就是最优化的,每个数据库都有自己的一些优化器,虽然可能还不太完善,但是它们都会在查询时对比过哪种方式较快,在某些情况下,建立索引的话也未必会快,例如索引放在一个不连续的存储空间时,这会增加读磁盘的负担,因此,哪个是最优,应该通过实际的使用环境来检验。

  在刚开始的时候,如果表不大,没有必要作索引,我的意见是在需要的时候才作索引,也可用一些命令来优化表,例如MySQL可用"OPTIMIZE TABLE"。

  综上所述,在如何为数据库建立恰当的索引方面,你应该有一些基本的概念

为MySQL数据库添加索引

标签:

热心网友 时间:2022-04-07 20:09

1.添加PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
MySQL创建索引语句详解mysql中创建索引语句

可以通过以下 SQL 语句在 MySQL 中创建索引:CREATE INDEX index_name ON table_name (column_name);其中,index_name 表示创建的索引名字,table_name 表示要创建索引的表名,column_name 是要创建索引的列名。需要注意的是,在创建索引时,索引字段的数据类型必须与表中该字段的数据类型相同。3. 索引...

MySQL如何创建多个索引操作方法详解mysql中创建多个索引

4. 主键索引:对一个表的主键字段创建的索引。ALTER TABLE table_name ADD PRIMARY KEY(column_name);二、为表创建多个索引 在MySQL中,可以为表创建多个索引。下面以普通索引和唯一索引为例,介绍如何为表创建多个索引。1. 创建多个普通索引 CREATE INDEX index_name_1 ON table_name(column_name_1...

mysql数据库怎么建索引?

1、使用SQLPlus或者PLSQL登录MySQL数据库。2、执行语句create index indexname on table(col) tablespace tablespacename;其中 "indexname"为需要建立索引的索引名;"table"是需要建立索引的表;"col"为需要建立索引的字段列;”tablespacename“为建立索引存放的空间(如果不需要制定表空间则使用“create index...

MySQL中使用SQL语句快速创建索引cmysql创建索引

在MySQL中,可以使用CREATE INDEX语句创建索引。它的语法如下:CREATE[UNIQUE或FULLTEXT或SPATIAL]INDEX [索引名称] ON [表名称] ([字段名称], …);其中,UNIQUE表示索引唯一,FULLTEXT表示全文索引,SPATIAL表示空间索引。索引名称是我们自己定义的,可以根据实际需求来命名。表名称是需要创建索引的表...

mysql怎么创建索引

MySQL中可以使用alter table这个SQL语句来为表中的字段添加索引。使用alter table语句来为表中的字段添加索引的基本语法是:ALTER TABLE <表名> ADD INDEX (<字段>);我们来尝试为test中t_name字段添加一个索引。mysql> alter table test add index(t_name);Query OK, 0 rows affected (0.17 sec)...

MySQL中两表关联的连接表如何创建索引图文详解

问题介绍创建数据库的索引,可以选择单列索引,也可以选择创建组合索引。遇到如下这种情况,用户表(user)与部门表(dept)通过部门用户关联表(deptuser)连接起来,如下图所示:表间关系问题就是,在这个关联表中该如何建立索引呢?针对该表,有如下四种选择:针对于user_uuid建立单列索引idx_user针对于...

如何正确合理的建立MYSQL数据库索引

MySQL索引类型包括:(1)普通索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式:◆创建索引 CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。◆修改表结构 ALTER mytable ADD ...

如何创建mysql索引以及索引的优缺点

创建唯一性索引,保证数据库表中每一行数据的唯一性。加快数据的检索速度,这也是创建索引的最主要的原因。减少磁盘IO(向字典一样可以直接定位)。通过创建唯一索引可以保证数据库表中每一行数据的唯一性。可以给所有的MySQL列类型设置索引。可以大大加快数据的查询速度,这是使用索引最主要的原因。在实现...

mysql如何建立索引

语法说明如下:<表名>:指定需要查看索引的数据表名。<数据库名>:指定需要查看索引的数据表所在的数据库,可省略。比如,SHOW INDEX FROM student FROM test; 语句表示查看 test 数据库中 student 数据表的索引。示例 使用 SHOW INDEX 语句查看《MySQL创建索引》一节中 tb_stu_info2 数据表的索引...

MySQL中怎样创建聚集索引和非聚集索引,求创建这两种索引的SQL语句。谢 ...

InnoDB按照主键进行聚集,如果没有定义主键,InnoDB会试着使用唯一的非空索引来代替。如果没有这种索引,InnoDB就会定义隐藏的主键然后在上面进行聚集。所以,对于 聚集索引 来说,你创建主键的时候,自动就创建了主键的聚集索引。而普通索引(非聚集索引)的语法,大多数数据库都是通用的:CREATE INDEX ...

数据库怎么创建索引 mysql数据库索引 mysql数据库索引有哪些类型 mysql数据库如何添加索引 mysql数据库索引原理 mysql数据库索引结构 mysql创建数据库 mysql如何创建索引 mysql创建索引
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我用银行卡网购了。怎么被注销了? 装电线的时候,不同区域该用什'么规格的电线? SY0401-98《输油输气管道线路工程施工及验收规范》废止后,用什么规范... 汇率一直变动,对中国工业品出口竞争力产生了影响,但是应该用什么... ...整个盘面流出资金大于流入资金,但是股票仍然升.. 请问股市或个股资金的流入与流出是什么意思啊? 股市之中的"资金流入"和"资金流出"分别是什么意思? 什么是股市中的资金流入和流出现象,如何理解 耕升gtx titan x 显卡怎么样 gtxtitanx是游戏显卡吗 如何正确建立MYSQL数据库索引 mysql有那些索引?分别在什么场景使用 mysql索引是什么意思 mysql索引有几种 mysql数据库怎么建索引? MySQL数据库的四类索引? mysql如何建立索引 MYSQL数据库索引类型都有哪些 【车主点评:豪华气质,爱车奔驰V260】 这款奔驰V260,爱国之人必选,品质又升级 2020新款奔驰v260l升级普曼豪华商务车,车身更霸气 奔驰V260AMG与V260尊贵有什么不同? 奶爸的换车体验——奔驰V260领航版,顺带使用细节分享 奔驰v2602019款报价 奔驰V260商务车适合全家使用吗? 谁知道奔驰V260L的基本参数是多少? 奔驰v260底盘升降怎么操作 奔驰v260油箱多大? 天津买奔驰V260缺点 捡的米兔手表4c怎样解绑? mysql索引怎么学 小米电话手表怎么解绑手机? 微Q怎么注册账号? 天津市华强顺达汽车租赁有限公司怎么样? 北京亿发顺达机械设备租赁有限公司怎么样? 中安顺达(北京)建设工程有限公司怎么样? 吉木萨尔县泰安顺达燃气有限公司怎么样? 肇庆市金顺达再生资源有限公司怎么样? 北京金路顺达汽车租赁服务有限公司怎么样? 广东华顺达贸易发展有限公司怎么样? 赴贵阳市数字经济考察报告 天津昌顺达建筑工程有限公司怎么样? 天津滨海新区大港顺达化工厂怎么样? 深圳市顺达捷装修有限公司怎么样? 吉安市吉州区吉顺达汽车租赁有限公司怎么样? 保定市宏远顺达物流运输有限公司怎么样? 北京国顺达投资有限公司怎么样? 登封市顺达耐材有限公司怎么样? 北京金日顺达信息咨询有限公司怎么样? 承德顺达铸造材料有限公司怎么样?