297 字
1 分钟

mysql查询设置大小写敏感以及性能(explain)对比

2018-10-16
2019-08-07

受到 此文 某些似懂非懂话语影响而折腾的笔记

解决方法:

查询时加上binary#

explain 分析 sql语句 其中type有变动(sk已加上索引) type值解析

使用 binary 查询时的第一组 EXPLAIN 结果

使用 binary 查询时的第二组 EXPLAIN 结果

而不加binary 不区分大小写时

不区分大小写查询时的 EXPLAIN 结果

查询时强制二进制对比,尤其不好,这会让你代码中多出很多判断,且还有可能被绕过。至于直接使用二进制字段,mysql不会将它当成字符来处理,我觉得也可能存在问题。

字段建立时指定字符类型#

点我查看 建立时的字符类型

MySQL 字段字符集与排序规则设置

  • 使用utf8_bin

    select * from api_key where sk = 'Gsxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'

    Select 语句可以区分大小写 执行效率:

    explain select * from api_key where sk = 'GSxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'

    utf8_bin 字段查询的 EXPLAIN 结果

  • 使用BINARY

MySQL BINARY 字段定义示例

`select * from api_key where sk = 'Gsxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'`
Select 语句可以区分大小写
执行效率:
`explain select * from api_key where sk = 'GSxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'`

BINARY 字段查询的 EXPLAIN 结果

数据库创建时修改#

方式1 方式2

laravel 数据库迁移解决方案#

public function up()
{
Schema::create('api_key', function (Blueprint $table) {
//一堆建表语句
});
//创建表成功后添加大小写敏感
DB::statement("alter table api_key modify column ak varchar(255) BINARY DEFAULT '' NOT NULL COMMENT 'as'");
DB::statement("alter table api_key modify column sk varchar(255) BINARY DEFAULT '' NOT NULL COMMENT 'as'");
}

最终得出#

以上更改其实本质上也是把collatioin(校对)模式改成二进制校对,实现大小写敏感。

索引长度在判断大小写时会增加1,但是type会变成ref;

附给细心同学的懒人链接:key_len

参考资料: https://www.cnblogs.com/sonofelice/p/6432986.html http://cevin.net/archives/让mysql查询区分大小写.html https://blog.csdn.net/dennis211/article/details/78170079 https://www.cnblogs.com/yuyue2014/p/3700531.html https://www.cnblogs.com/clphp/p/5403215.html

mysql查询设置大小写敏感以及性能(explain)对比
https://www.motouguai.com/note/mysql-query-sets-case-sensitivity-and-performance-explain-comparison/
作者
Murry
发布于
2018-10-16
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时