Sql的优化问题,含索引

count(field)速度非常慢,建议使用count(1)和count(*),mysql做了优化

过滤操作尽量写在最内层,过滤要趁早

join的时候尽量将配置表放在内层,拿配置表(如人员表)去join大表

尽量不要取出所有数据,比如可以拿in 某些条件的 部分人员的数据出去再加工

不要使用select * :1.不需要的列会增加数据传输时间和网络开销

                               2.对于无用的大字段,如 varchar、blob、text,会增加 io 操作

                                  准确来说,长度超过 728 字节的时候,会先把超出的数据序列化到另外一个地方,因此读取这条记录会增加一次 io 操作。(MySQL InnoDB)

                               3. 失去MySQL优化器“覆盖索引”策略优化的可能性

                                  SELECT * 杜绝了覆盖索引的可能性,而基于MySQL优化器的“覆盖索引”策略又是速度极快,效率极高,业界极为推荐的查询优化方式。

 

普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。 
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。

 

 

Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引

PRIMARY KEY(主键索引)  ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

UNIQUE(唯一索引)                 ALTER TABLE `table_name` ADD UNIQUE (`column`)

INDEX(普通索引)                    ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 

FULLTEXT(全文索引)             ALTER TABLE `table_name` ADD FULLTEXT ( `column` )
组合索引                                 ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` ) 
 

复合索引最左原则

有一个复合索引:INDEX(abc)

使用方式 能否用上索引
select * from users where a = 1 and b = 2 能用上a、b
select * from users where b = 2 and a = 1 能用上a、b(有MySQL查询优化器)
select * from users where a = 2 and c = 1 能用上a
select * from users where b = 2 and c = 1 不能

解释:其实就像是闯关,只有第一关打通了,才能打第二关,第一关和第二关都过了才能打第三关,所以在设计索引的时候要把最常用的放在最左边

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章