推荐回答
这个问题涉及到“覆盖索引”这个概念。你第一个查询是查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