Distinct,limit,group by(having关键字什么时候用)
Distinct去重
SELECT DISTINCT Company FROM Orders 根据某字段去重
SELECT DISTINCT * FROM Orders 根据所有字段去重
limit限制行数
group by 分组,having 对分组之后结果进行限制
GROUP BY子句之后使用Having子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。因此,在GROUP BY子句后面包含了一个HAVING子句。HAVING类似于WHERE(唯一的差别是WHERE过滤行,HAVING过滤组)AVING支持所有WHERE操作符。
常见索引的类型,索引的数据结构一般是什么
常见索引类型
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
FULLTEXT(如倒排)
BTREE(oracle默认索引)
详细参考该博客https://www.cnblogs.com/yuan-shuai/p/3225417.html
-
普通索引
这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。 -
唯一索引
索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。 -
全文索引(FULLTEXT)
MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。 -
单列索引、多列索引
多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。 -
组合索引(最左前缀)
平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索 -
建立索引时,要选中索引类型
-
CREATE FULLTEXT INDEX index_content ON article(content)
-
CREATE UNIQUE INDEX indexName ON table(column(length))
-
CREATE INDEX index_name ON table(column(length))
多字段组成的索引什么时候能用到什么时候不能用到。范围查询使用索引的特点
- 联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。两个或更多个列上的索引被称作复合索引。
- 哪些字段可以建索引,一般都where、order by 或者 group by 后面的字段。
- 多个字段组合标识一个信息的时候,如人名与电话,这两个字段组合索引有较大意义
- 利用索引中的附加列,可以缩小搜索的范围
- ==范围查询使用索引特点:==范围查询后,其他字段将不再走索引
如:索引建立是三个字段 顺序是a b c ,条件是 a=1 and b>60 and c=2,则c不再走索引