mysql失效怎么处理 mysql出现错误

Mysql高级(五) 索引失效

1.全值匹配

成都创新互联公司是一家专业提供松滋企业网站建设,专注与成都做网站、网站建设、H5开发、小程序制作等业务。10年已为松滋众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。

2.最佳左前缀法则

3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

4.存储引擎不能使用索引中范围条件右边的列

5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一直)),减少select *

6.mysql在使用不等于(!=或者)的时候无法使用索引会导致全表扫描

7.is null, is not null也无法使用索引

8.like以通配符开头(‘%abc...’)mysql索引失效会变成全表扫描的操作

9.字符串不加单引号索引失效

10.少用or,用它来连接时索引会失效

mysql 索引失效总结

首先我们还是先把表结构说下:用户表tb_user结构如下:

1、 不要在索引列上进行运算操作, 索引将失效。

手机号phone字段有唯一索引,当根据phone字段进行函数运算操作之后,索引失效:

2、 字符串类型字段使用时,不加引号,索引将失效。

如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。

3、 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

接下来,我们来看一下这三条SQL语句的执行效果,查看一下其执行计划:

由于下面查询语句中,都是根据profession(专业)字段查询,profession字段是一个普通的索引, 我们主要看一下,模糊查询时,%加在关键字之前,和加在关键字之后的影响。

经过上述的测试,我们发现,在like模糊查询中,在关键字后面加%,索引可以生效。而如果在关键字 前面加了%,索引将会失效。

4、 用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会 被用到。

由于age没有索引,所以即使id有索引,索引也会失效。所以需要针对于age也要建立索引。

5、 数据分布影响:如果MySQL评估使用索引比全表更慢,则不使用索引。

mysql utf8_encoding无效解决方案

服务器端

修改数据库配置文件/etc/my.cnf

character-set-server=utf8mb4

collation_server=utf8mb4_unicode_ci

重启MySQL(按照官方文档,这两个选项都是可以动态设置的,但是实际的经验是Server必须重启一下)

已有的表修改编码为utf8mb4

ALTER TABLE

tbl_name

CONVERT TO CHARACTER SET

charset_name;

使用下面这个语句只是修改了表的default编码

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4;

客户端

jdbc的连接字符串不支持utf8mb4,这个 这种方式 来解决的,如果服务器端设置了character_set_server=utf8mb4,则客户端会自动将传过去的utf-8视作utf8mb4。

Connector/J did not support utf8mb4 for servers 5.5.2 and newer.

Connector/J now auto-detects servers configured with character_set_server=utf8mb4 or treats the Java encoding utf-8 passed using characterEncoding=... as utf8mb4 in the SET NAMES= calls it makes when establishing the connection. (Bug #54175)

其他的client端,比如php、python需要看下client是否支持,如果不能在连接字符串中指定的话,可以在获取连接之后,执行”set names utf8mb4″来解决这个问题;

因为utf8mb4是utf8的超集,理论上即使client修改字符集为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。


名称栏目:mysql失效怎么处理 mysql出现错误
当前地址:http://hbruida.cn/article/doeddoi.html