MYSQL索引问题索引在查询中如何使用?

龚少情 2019-12-21 23:56:00

推荐回答

这个问题涉及到“覆盖索引”这个概念。你第一个查询是查count*,实际上值需要使用索引test,就能完全得到结果,不需要回聚簇索引查其他字段,因此InnoDB认为用这个所以比全表扫描快。而第二个查询因为要访问iMoney,需要“回表”,用不上覆盖索引。另外一个原因是索引字段的顺序,如果你把test定义为iType,dtEventTime,这个查询应该就能用上test这个索引。而现在字段顺序会导致你这个查询,即使要用这个索引,也只能用到第一个字段。
黄盛彬2019-12-22 00:06:50

提示您:回答为网友贡献,仅供参考。

其他回答

  • 显示一个表所有索引的SQL语句是:showindexfrom数据库名.表名查看某表某一列上的索引使用下面的SQL语句:showindexfrom数据库名.表名wherecolumn_namelike''列名''下面的SQL语句在我的数据库上执行成功:showindexfromweb.clubuserwherecolumn_namelike''user。
    黄百煜2019-12-22 01:00:11
  • mysql可以用查询语句查询出一张表中存在的所有索引,语句如下:showindexesfromtable;显示table表中的所有索引。
    龚子龙2019-12-22 00:54:49
  • explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。使用方法,在select语句前加上explain就可以了:如:explain select surname,first_name form a,b where a.id=b.idEXPLAIN列的解释:table:显示这一行的数据是关于哪张表的type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALLpossible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句key:实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USEINDEXALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。
    米多多2019-12-22 00:36:50
  • MYSQL在创建索引后对索引的使用方式分为两种:1由数据库的查询优化器自动判断是否使用索引;2用户可在写SQL语句时强制使用索引下面就两种索引使用方式进行说明第一种,自动使用索引。数据库在收到查询语句后会查看where语句后面的查询条件,同时查看在表上面有哪些索引,然后根据查询条件和索引进行匹配。查询条件和索引的匹配包括查询字段与索引字段的匹配和查询类型和索引类型的匹配。前者很好理解,就是查询条件的属性上要建有索引,后者则是说查询条件必须能够使用索引,比如等值判断和范围查询可以使用B+树索引,而hash索引只能适用于等值判断。在找到与查询条件匹配的索引后,就是进行代价估计来决定是否使用索引,代价估计主要根据要访问的就数量,一般来说如果通过索引访问的记录数量占全表记录数量15%以上,则不会使用索引而是使用全表扫描,因为此时使用索引的代价更大。在大多数情况下使用索引是会提高效率的。经过优化器的判断,最终会决定是否使用索引第二种,强制使用索引,主要是通过SQL语句实现的select*fromtableforceindexPRIlimit2;强制使用主键select*fromtableforceindexziduan1_indexlimit2;强制使用索引"ziduan1_index"select*fromtableforceindexPRI,ziduan1_indexlimit2;强制使用索引"PRI和ziduan1_index"也可以禁止索引的使用select*fromtableignoreindexPRIlimit2;禁止使用主键select*fromtableignoreindexziduan1_indexlimit2;禁止使用索引"ziduan1_index"select*fromtableignoreindexPRI,ziduan1_indexlimit2;禁止使用索引"PRI,ziduan1_index。
    齐新萍2019-12-22 00:19:06

相关问答

VF常用SQL语句大全SQL是结构化查询语言,查询是SQL语言的重要组成部分,但不是全部,SQL还包括数据定义,数据操纵和数据控制功能等部分.如今SQL已成为关系数据库的标准数据语言,所以现在的关系数据库管理系统都支持SQL.FOXPRO从2.5FORDOS版式就开始支持SQL,现在VISUALFOXPRO当然在之方面更加完善,以下是VF经常用到SQL语句.--语句功能--数据操作SELECT--从数据库表中检索数据行和列INSERT--向数据库表添加新数据行DELETE--从数据库表中删除数据行UPDATE--更新数据库表中的数据--数据定义CREATETABLE--创建一个数据库表DROPTABLE--从数据库中删除表ALTERTABLE--修改数据库表结构CREATEVIEW--创建一个视图DROPVIEW--从数据库中删除视图CREATEINDEX--为数据库表创建一个索引DROPINDEX--从数据库中删除索引CREATEPROCEDURE--创建一个存储过程DROPPROCEDURE--从数据库中删除存储过程CREATETRIGGER--创建一个触发器DROPTRIGGER--从数据库中删除触发器CREATESCHEMA--向数据库添加一个新模式DROPSCHEMA--从数据库中删除一个模式CREATEDOMAIN--创建一个数据值域ALTERDOMAIN--改变域定义DROPDOMAIN--从数据库中删除一个域--数据控制GRANT--授予用户访问权限DENY--拒绝用户访问REVOKE--解除用户访问权限--事务控制COMMIT--结束当前事务ROLLBACK--中止当前事务SETTRANSACTION--定义当前事务数据访问特征--程序化SQLDECLARE--为查询设定游标EXPLAN--为查询描述数据访问计划OPEN--检索查询结果打开一个游标FETCH--检索一行查询结果CLOSE--关闭游标PREPARE--为动态执行准备SQL语句EXECUTE--动态地执行SQL语句DESCRIBE--描述准备好的查询---局部变量declare@idchar10--set@id=10010001select@id=10010001---全局变量---必须以@@开头--IFELSEdeclare@xint@yint@zintselect@x=1@y=2@z=3if@x>@yprintx>y--打印字符串x>yelseif@y>@zprinty>zelseprintz>y--CASEusepanguupdateemployeesete_wage=casewhenjob_level=’1’thene_wage*1.08whenjob_level=’2’thene_wage*1.07whenjob_level=’3’thene_wage*1.06elsee_wage*1.05end--WHILECONTINUEBREAKdeclare@xint@yint@cintselect@x=1@y=1while@x<3beginprint@x--打印变量x的值while@y<3beginselect@c=100*@x+@yprint@c--打印变量c的值select@y=@y+1endselect@x=@x+1select@y=1end--WAITFOR--例等待1小时2分零3秒后才执行SELECT语句waitfordelay’01:02:03’select*fromemployee--例等到晚上11点零8分后才执行SELECT语句waitfortime’23:08:00’select*fromemployee。