mysql

"mysql"

Posted by zwt on December 8, 2020

软件地址

链接:https://pan.baidu.com/s/15xEbeq5O-cJ00nHSW7fs5w 提取码:kius

安装过程

在主目录下创建my.ini文件:

1
2
3
4
5
6
7
8
9
10
11
12
[client]
port=3306
default-character-set=utf8 
[mysqld] 
basedir=D:\JavaTools\mysql-5.7.19-winx64
datadir=D:\JavaTools\mysql-5.7.19-winx64\data
port=3306
character-set-server=utf8
character-set-filesystem = utf8
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
explicit_defaults_for_timestamp=true
skip-grant-tables

命令行模式进入到文件夹bin下:

1
mysqld --initialize-insecure

mysql服务安装

1
mysqld install

启动mysql

1
net start mysql

上面设置完后是没有密码的。 进入mysql环境

1
mysql -u root

修改密码:

1
2
3
4
alter user root@localhost identified by "12345";
报错:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
输入:flush privileges;
再重新修改密码即可

索引

添加PRIMARY KEY(主键索引)

1
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

添加UNIQUE(唯一索引)

1
2
3
ALTER TABLE `table_name` ADD UNIQUE ( 
`column` 
) 

添加INDEX(普通索引)

1
ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 

删除索引:

1
DROP INDEX index_name;

查看索引:

1
SHOW INDEX FROM table_name [FROM db_name]

删除索引:

1
ALTER  TABLE  borrow_order   DROP  INDEX  idx_status_stitution

全文索引

基础

全文索引只能使用 InnoDB或 MyISAM表格,并且只能用于创建CHAR, VARCHAR或 TEXT列。 对于大型数据集,将数据加载到没有FULLTEXT索引的表中然后再创建索引比将数据加载到具有现有FULLTEXT索引的表中要快得多

三种全文检索类型:

1
2
3
自然语言搜索将搜索字符串解释为自然人类语言中的短语(默认)
布尔搜索使用特殊查询语言的规则解释搜索字符串。该字符串包含要搜索的单词。它还可以包含指定要求的运算符,以使匹配行中的单词必须存在或不存在,或者其权重应高于或低于平常(IN BOOLEAN MODE)
查询扩展搜索是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后,将搜索返回的最相关行中的单词添加到搜索字符串中,然后再次执行搜索。该查询返回第二个搜索中的行(IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION)

操作

建表的时候就创建:

1
2
3
4
5
6
7
CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT,
      FULLTEXT (title,body) WITH PARSER ngram
    ) ENGINE=InnoDB CHARACTER SET utf8mb4;
    

后期添加全文索引:

1
ALTER TABLE fulltext_test ADD FULLTEXT INDEX ft_index (pinyin, dish_name, n_gram) WITH PARSER ngram;

查询语句:

1
select * from fulltext_test where match(pinyin, dish_name, n_gram) against('%s' IN BOOLEAN MODE)""" % (text)

查询sql性能

profile分析

基本流程

1
2
3
4
5
6
7
8
9
10
11
set profiling=1;                  //打开分析
run sql
run sq2
show profiles;                    //查看sql1,sql2的语句分析
show profile for query 1;        //查看sql1的具体分析
show profile ALL for query 1;    //查看sql1相关的所有分析
set profiling=0;                  //关闭分析

也可以只查询cpu io等
SHOW profile CPU,BLOCK IO FOR query 2;
show profile cpu for query 1;

结果参数意义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
横轴:
"Status": "query end", 状态
"Duration": "1.751142", 持续时间
"CPU_user": "0.008999", cpu用户
"CPU_system": "0.003999", cpu系统
"Context_voluntary": "98", 上下文主动切换
"Context_involuntary": "0", 上下文被动切换
"Block_ops_in": "8", 阻塞的输入操作
"Block_ops_out": "32", 阻塞的输出操作
"Messages_sent": "0", 消息发出
"Messages_received": "0", 消息接受
"Page_faults_major": "0", 主分页错误
"Page_faults_minor": "0", 次分页错误
"Swaps": "0", 交换次数
"Source_function": "mysql_execute_command", 源功能
"Source_file": "sql_parse.cc", 源文件
"Source_line": "4465" 源代码行

纵轴:
starting:开始
checking permissions:检查权限
Opening tables:打开表
init : 初始化
System lock :系统锁
optimizing : 优化
statistics : 统计
preparing :准备
executing :执行
Sending data :发送数据
Sorting result :排序
end :结束
query end :查询 结束
closing tables : 关闭表 /去除TMP 表
freeing items : 释放物品
cleaning up :清理

explain

语法:

1
explain sql

结果分析:

1
2
3
4
5
6
7
8
9
10
id:这是SELECT的查询序列号
select_type:select_type就是select的类型
table:显示这一行的数据是关于哪张表的
type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一
possible_keys:列指出MySQL能使用哪个索引在该表中找到行
key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示使用哪个列或常数与key一起从表中选择行。
rows:显示MySQL认为它执行查询时必须检查的行数。
Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。

show processlist

语法:

1
show processlist;

结果分析:

1
2
3
4
5
6
7
8
id列,用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看
user列,显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句
host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户
db列,显示这个进程目前连接的是哪个数据库
command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等
time列,显示这个状态持续的时间,单位是秒
state列,显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending data等状态才可以完成
info列,显示这个sql语句,是判断问题语句的一个重要依据,一般记录的是线程执行的语句。默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用 show full processlist。

用ip访问mysql

1
2
3
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '';
flush privileges;
然后重启mysql

sql

显示结构

1
2
3
4
5
6
7
8
9
10
1.describe table_name
2.show tables
3.use database
4.show databases
5.修改表名:alter table t_book rename to bbb
6.添加列:alter table 表名 add column 列名 varchar(30)
7.删除列:alter table 表名 drop column 列名
8.replace into table() values()
9.ALTER TABLE stu change gender sex CHAR(2)
10.修改表名:alter table oldname rename newname

注意

1
2
3
1.索引的数据类型必须和select查询时所传入的数据类型一致。
2.or或者是%将不走索引
3.order by 后的字段不在where中将不走索引,可以单独做索引,否则就基于查询得到的结果进行排序操作。

其他操作

基于panda进行操作

1
2
3
4
5
6
7
8
9
import pymysql
import pandas as pd
from urllib.parse import quote
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://r:%s@host:3306/db" % quote('p'))
sql = """
select * from tablename
"""
df = pd.read_sql_query(sql, engine)

添加列

1
2
3
4
5
6
7
添加列:alter table 表名 add column 列名 varchar(30); 
修改表名:alter table t_book rename to bbb; 
删除列:alter table 表名 drop column 列名;  
修改列名MySQL: alter table bbb change nnnnn hh int; 
修改列属性:alter table t_book modify name varchar(22); 
查看表的所有信息:show create table 表名;

参考

1.mysql