[MySQL]细节与使用经验
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/18032065
出自【进步*于辰的博客】
纯文字阐述,内容比较干。并且,由于考虑到时间长了恐有所遗漏,便即兴记录,并没有对内容进行筛选、排序。因此,大家在阅读时可以直接Ctrl + F进行检索。
1、细节锦集
- 进入命令行的方法:(1)开始 → MySQL → MySQL Command Line;(2)配置环境变量
path
指向MySQL安装目录下的bin
目录,从 cmd 登录MySQL。 - 查看MySQL安装目录:
show variables like '%char%'
。 - 登录MySQL命令:
mysql -hA -PB -uC -pD E
,如:mysql -hlocalhost -P3306 -uroot -p123456 bpmtest
。 - 查看MySQL版本方法:(1)
status
;(2)select version()
;(3)登录成功后显示。 - 驱动包类:(1)
6.x
版本及以下:com.mysql.jdbc.Driver
;(2)6.x
版本及以上:com.nysql.cj.jdbc.Driver
。
2、解除死锁方法
参考笔记二,P17.6。
无论何种事务隔离级别,都是通过“锁”来实现。在高并发情况下,容易出现“死锁”。(PS:如果大家想要了解事务隔离级别,可查阅博文《[SQL]事务》)。
如何解除死锁?这里涉及到几个表:
information_schema
数据库记录了MySQL服务器所有数据库的信息,包括:数据库名、数据表、字段的数据类型和访问权限等。
其中,innodb_trx
表用于存储当前运行的所有事务信息、innoda_locks
表存储当前锁信息、innodb_lock_waits
表存储所有锁等待的关系(数据表)信息、processlist
存储事务线程信息。
解锁方法:
select * from information_schema.innodb_trx;
部分字段:
其中,trx_state
是“事务状态”,trx_mysql_thread_id
是“事务线程ID”。
找到事务状态是wait...
的记录(“死锁”记录),使用以下命令“杀死”事务线程:
kill 线程ID;
3、关于字段
3.1 使用细节
- 尽量设置为
not null
,因为查询时不必考虑null
对查询的影响; - 存储如 国家、省份、性别 这类数据的字段,可以使用外键,但多连接会导致性能降低、以及工作量的增加,这是没必要的。由于此类字段已固定数据,则数据类型可以选
enum
,且可以用一些标识表示数据,如:0=男,1=女
、CN-中国,UK-英国
。
MySQL会将enum
视为“数值”处理,故效率远高于字符类型。但要注意:若此字段可能用于 连接、筛选,就要考虑有没有必要使用enum
,因为enum
属于“字符”类型,查询时要加上''
(单引号)、以及进行一些字符处理(额外工作量),如:性别,使用int
优于enum
。
3.2 字符匹配
1、若字段类型为 数值 类型,可匹配字符。
示例:
1、select * from xx where id = 10; √
2、select * from xx where id = '10'; √
2、若字段类型为 字符 类型,不可匹配数字。
示例:
1、select * from xx where no = '1001'; √
2、select * from xx where no = 1001; ×
4、字符排序
参考笔记二,P12.6、P17.7。
在查询中时常需要排序,普遍情况下(数据类型是数值)使用order by
即可解决。若数据类型为字符,排序方法如下:
- 方法一:
order by 字段 + 0
:会将数据进行数值转换后再进行比较,转换时以非数字结束,如:'58a13', + 0 → 58
、'ab' + 0 → 0
; - 方法二:
order by cast(a, b) / order by convert(a, b)
:都用于将字段值转换为另一类型再进行比较。其中,a 是字段,b 为转换类型。b 的取值:(1)unsigned
:无符号数字,不能表示小数;(2)signed
:有符号数字,可以表示小数。
当然,这两种方法都不可能完全实现字符类型字段的排序,需要根据具体数据判断(此需求近似“伪需求”)。不过,这两种字符处理是有效的。
最后
本文中的例子是为了方便大家理解和阐述知识点而简单举出的,旨在阐明知识点,并不一定有实用性,仅是抛砖引玉。
如果大家想要了解一些MySQL知识点,可查阅博文《[MySQL]知识点》。
本文持续更新中。。。