假设MySQL数据库表:
create table T{k int unsigned not null auto_increment,a date,b varchar(24),c int,d varchar(24),primary key(k),unique key a_index (a DESC,b DESC),key k1(b),key k2(c),key k3(d));
如下哪些sql语句查询能较好的利用索引?()
create table T{k int unsigned not null auto_increment,a date,b varchar(24),c int,d varchar(24),primary key(k),unique key a_index (a DESC,b DESC),key k1(b),key k2(c),key k3(d));
select b from WHERE b like 'aaa%';
select a,b from T WHERE a='2015-10-25' ORDER BY b ASC,c ASC;
select a,b,c from T WHERE a='2015-10-25' ORDER BY b ASC;
select a,b,c from T WHERE a='2015-10-25' ORDER BY a,b;
create table T( k INT UNSIGNED NOT NULL AUTO_INCREMENT, a DATE, b varchar(24), c INT, d varchar(24), PRIMARY KEY(k), UNIQUE KEY a_index(a DESC,b DESC), KEY k1(b), KEY k2(c), KEY k3(d) )
create table T{k int unsigned not null auto_increment, 自动递增 auto_increment
a date,b varchar(24),c int,
d varchar(24),primary key(k),unique key a_index (a DESC,b DESC),
key k1(b),key k2(c),key k3(d)
);
Key是索引约束,对表中字段进行约束索引的,都是通过primary foreign unique等创建的。常见有foreign key,外键关联用的。
KEY forum (status,type,displayorder) # 是多列索引(键)
KEY tid (tid) # 是单列索引(键)。
尽量避免在一个复杂查询里面使用 LIKE '%parm1%', 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用 last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置 时,优化器就能利用索引。在下面的查询中索引得到了使用: select * from employee where last_name like ' c% ' ;
ORDER BY 语句用于根据指定的列对结果集进行排序。ORDER BY 语句默认按照升序对记录进行排序。
①SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
--order by的字段混合ASC和DESC,不使用索引
The index can also be used even if the ORDER BY does not match the index exactly, as long as all of the unused portions of the index and all the extra ORDER BY columns are constants in the WHERE clause.
即使order by 中的内容没有完全和索引内容一样,但只要未在order by中的部分出现在了where语句中,也可以使用索引In some cases, MySQL cannot use indexes to resolve the ORDER BY, although it still uses indexes to find the rows that match the WHERE clause.
在有些情况下,mysql不能使用索引去排序,但是也可以使用索引去找到相应的WHERE过滤后的结果集