mysql索引优化

索引不适用于超大型数据库和小型数据库,但是对中大型数据库非常适合。

不适合在频繁插入删除数据的表上建立索引。

 

1 单列的索引

2 多列索引   索引列1,2,3

   重要:索引1,2,3的顺序很重要!并且索引1是基点,索引生效的查询必须带有索引1.

    能使用索引的情况:

                       1)全列匹配 1,2,3  

                       2)只使用索引1,并且只适合对索引1的范围匹配和以xx开头的查找,不能用于以xx结尾的查询 

            3)索引1全匹配,索引2 范围匹配,但是不能使用索引1和索引3,即不能跳过索引中的列。(如果没有指定索引2,则只能使用索引1)

                        4)满足上面3个的查询中,有某个列有范围查询,则其右边的所有列都无法使用索引优化查询

 

 

where条件左侧不能是表达式,例如:where age+1=23。则会使索引失效。应该改为 where  age =22;

 

空值跟null的区别。mysql官方:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间(见上面的e文),还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。

尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

1:在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。

2: 判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可以使用ifnull()函数来进行处理,判断空字符用=''或者 <>''来进行处理

3: 对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现 '0000-00-00 00:00:00'

4:对于空值的判断到底是使用is null 还是 =''要根据实际业务来进行区分。

5:空值('')是不占用空间的

6: MySQL中的NULL其实是占用空间的。

 

【推荐】如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。正例:where a=? and b=? order by c; 索引:a_b_c反例:索引中有范围查找,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引a_b 无法排序。

 

【推荐】SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts最好。

 

【强制】主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值