乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

使用docker在服务器部署vscode实现云端web开发

发表于 2020-10-12

采用codercom/code-server

拉取codercom/code-server镜像

1
docker pull codercom/code-server

运行code-server 容器

1
docker run -it --name=code_server  -p 8443:8080 -p 4001:4000 -v /root/songjian:/home/coder/songjian -h code_server -e PASSWORD=123  codercom/code-server

浏览器中输入ip:8843 开始云端开发之旅

编辑代码时出现权限问题

解决方案:
在宿主机中开放读写权限

1
chmod a+rwx -R /root/songjian/

或者在容器运行的时候指定用户组为root (推荐)

1
docker run -it -u root --name=code_server  -p 8443:8080 -p 4001:4000 -v /root/songjian:/home/coder/songjian -h code_server -e PASSWORD=123  codercom/code-server

问题解决

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

MySQL8.0登录提示caching_sha2_password问题解决方法

发表于 2020-09-30

背景

用docker构建mysql容器后连接遇到以下问题

问题

1
2
3
4
5
6
Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found
1
mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
1
mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client
1

MySQL官方说明

解决方法1(docker)

适用场景

  1. 第一次构建容器/安装
  2. 已安装完成后新增用户

配置

配置 mysql.cnf 配置默认身份验证插件

1
2
3
[mysqld]
default_authentication_plugin = mysql_native_password
12

验证是否生效

使用CLI进入MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ mysql -u root -p
1
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT Host, User, plugin from user;
+-----------+------------------+-----------------------+
| Host | User | plugin |
+-----------+------------------+-----------------------+
| % | root | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | mysql_native_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)
12345678910111213141516

root用户的身份验证器插件已经变为:mysql_native_password

解决方法2

适用场景

  1. MySQL 已成功安装完成后

查看身份验证类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> use mysql;
Database changed

mysql> SELECT Host, User, plugin from user;
+-----------+------------------+-----------------------+
| Host | User | plugin |
+-----------+------------------+-----------------------+
| % | root | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)
1234567891011121314

root 用户的验证器插件为 caching_sha2_password

修改身份验证类型(修改密码)

1
2
3
4
5
6
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
12345

使生效

1
2
mysql> FLUSH PRIVILEGES;
1

验证是否生效

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT Host, User, plugin from user;
+-----------+------------------+-----------------------+
| Host | User | plugin |
+-----------+------------------+-----------------------+
| % | root | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | mysql_native_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于WordPress 安装主题或插件时提示需要登陆FTP解决方法

发表于 2020-09-30

wp-config.php里加入下面代码:

在wp-config.php里加入下面代码:

1
2
3
define( 'FS_METHOD',  'direct');
define( 'FS_CHMOD_DIR', 0777);
define( 'FS_CHMOD_FILE', 0777);

加入完毕后不再提示FTP登录, 但是有可能安装插件时提示 安装失败,无法创建目录

解决方案:

1
2
3
4
chmod -R 777 wp-content/ 
chmod -R 777 theme/
chmod -R 777 plugin/
chmod -R 777 language/

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

怎样修改Wordpress地址和站点地址怎样改回IP地址

发表于 2020-09-30

wordpress搭建后地址栏页面显示IP地址的问题

如果可以登录wordpress后台管理面板

1.先点击wordpress右边的小房子图标

2.点击仪表盘图片进入仪表盘菜单

3.点击设置,进入设置界面,找到WordPress地址(URL)和站点地址(URL)所对应的ip地址,如下图

4.将ip地址更改为你网站的域名,之后保存,如下图

5.清空浏览器的缓存,之后用域名访问网站,就不会在地址栏出现ip地址了。

如果无法登陆wordpress

那么需要修改数据库 如图


乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

mysql使用命令导入和导出sql文件

发表于 2020-09-30

window下

1.导出整个数据库,首先打开要导出的目录

1
2
3
4
5
mysqldump -u 用户名 -p 数据库名 > 导出的文件名

mysqldump -u dbuser -p dbname > dbname.sql 下一行需要输入密码

mysqldump -uroot -proot [dbname]> english.sql 在本行直接输入密码

2.导出一个表

1
2
3
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

mysqldump -u dbuser -p dbname users> dbname_users.sql

3.导出一个数据库结构

1
2
3
mysqldump -u dbuser -p -d --add-drop-table dbname >d:/dbname_db.sql

-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

4.导入数据库

常用source 命令

进入mysql数据库控制台,如

1
2
3
mysql -u root -p

mysql>use 数据库名;

如果数据库不存在 则则新建:

1
mysql>create database 数据库名;

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

1
mysql>source d:/dbname.sql

linux下

一、导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):

1、导出数据和表结构:

1
2
3
mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql

\#/usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql

敲回车后会提示输入密码

2、只导出表结构

1
2
3
4
5
mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql

\#/usr/local/mysql/bin/ mysqldump -uroot -p -d abc > abc.sql

注:/usr/local/mysql/bin/ ---> mysql的data目录

二、导入数据库

1、首先建空数据库

1
mysql>create database abc;

2、导入数据库

方法一:

(1)选择数据库

1
mysql>use abc;

(2)设置数据库编码

1
mysql>set names utf8;

(3)导入数据(注意sql文件的路径)

1
mysql>source /home/abc/abc.sql;

方法二:

1
2
3
mysql -u用户名 -p密码 数据库名 < 数据库名.sql

\#mysql -uabc_f -p abc < abc.sql

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Linux文件误删后如何恢复

发表于 2020-09-30

以下方法适用于文件或目录被删,如果被覆盖则无法恢复

方法一 使用系统自带的还原工具debugfs

  1. 第一步 查看文件或目录锁挂载的磁盘名
1
df  /root/你被删的目录
  1. 输入debugfs指令进入命令区
1
root@xxx:# /debugfs
  1. 进入挂载磁盘 查找被删目录和文件
1
2
open dev/vda1 #这个是我服务磁盘名 你的也许不一样
ls -d /root/你被删的目录 #查找被删文件

带尖括号开头的文件表示已经被删除的 无尖括号表示当前已经存在的文件

接下来 咱们需要借助尖括号中的地址进行文件还原

  1. 根据node地址查找文件信息, 在debugfs命令区中输入
1
logdump -i <19662057>

  1. 文件还原

    1
    dd  if=/dev/vda1 of=/root/被删除文件  bs=3456 count=1 skip=524974

* bs对应offset 表示文件大小
* count 表示需要还原几份
* skip对应block值 表示跳过blocks个块后再开始复制

至此 恢复完毕

### 方法二 使用第三方的还原工具extundelete

  1. 第一步 安装
1
apt-get install extundelete -y
  1. 第二步 获取被删文件或目录的node
1
ls -lia 目标目录
  1. 根据node查看文件信息
1
extundelete /dev/sda5 --inode 24904454
1
2
3
4
5
6
#以下为控制台输出信息
File name | Inode number | Deleted status
. 2
.. 2
deletetest 12 Deleted
tmppasswd 14 Deleted
  1. 恢复全部数据
1
extundelete /dev/sda5 --restore-all
  1. 恢复单个数据
1
extundelete /dev/sdb5 --restore-file xxx
  1. 恢复指定目录
1
extundelete /dev/sdb5 --restore-directory  xxx

至此 ,恢复完毕

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用nginx部署django项目需要注意的问题

发表于 2020-09-23

首先配置nginx.conf文件

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
worker_processes  1;
events {
worker_connections 1024;
}
http{
server{
listen 80;
server_name py.newban.cn; #
root /usr/share/nginx/html/blog;
index index.html;
}
server{
listen 80;
server_name blog.newban.cn; #
root /usr/share/nginx/html/blog2;
index index.html;
}


#反向代理部分
upstream my.blog{ #部署django 名称不能使用下滑线分割比如my_blog 否则报错
server 118.10.25.17:8000 weight=1;
#负载均衡 随机访问 权重1:1 各占50%
server 118.10.25.17:8001 weight=1;
}
server{
listen 80;
server_name py.insoan.com; #
location / {
proxy_pass http://my.blog;
index index.html;
}
}
}

问题1 DisallowedHost at /

使用 nginx 部署django时,会出现下面的错误

  1. 首先使用的域名不符合 RFC 1034/1035.规范时,会出现下面的错误(如包含下划线)
1
DisallowedHost at /Invalid HTTP_HOST header: 'learning_log.cent.com'. The domain name provided is not valid according to RFC 1034/1035.
  1. 解决方式:

修改域名,去除下划线,即将 learning_log.cent.com 修改成 llog.cent.com

  1. 再重新访问出现另外一个错误
1
invalid http_host header
  1. 解决方式

将 setting.py 的 ALLOWED_HOSTS = [] 修改成 ALLOWED_HOSTS = [‘*’]

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

docker部署Django项目

发表于 2020-09-23

一、概述

已经写好了一个Django项目,需要将这个项目用docker封装一个镜像,使用k8s发布!

在封装并运行的过程中,发现了很多问题,这里会一一介绍!

二、时区问题

采用的是镜像是 ubuntu:16.04 默认的时区是UTC,比中国时间,晚了8个小时!

那么因此,需要将默认的时区给覆盖掉!

默认是没有安装 tzdata,因此没有 /usr/share/zoneinfo 目录!

安装tzdata,使用命令

1
apt-get install -y tzdata

设置时区为 上海,使用以下命令

1
2
TZ=Asia/Shanghai
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

三、中文乱码问题

默认的系统编码是ascii,因此不支持中文!

需要安装 locales 软件包

1
apt-get install -y locales

设置utf-8编码

1
locale-gen en_US.UTF-8

设置全局变量

1
2
3
LANG en_US.UTF-8
LANGUAGE en_US:en
LC_ALL en_US.UTF-8

设置utf-8编码之后,那么在python的print命令,就可以输出中文了,而不会提示

1
'ascii' codec can't encode characters in position 8-50: ordinal not in range(128)

在python文件头部,记得增加一行代码,指定utf-8编码

1
# coding: utf-8

四、任务计划问题

启动问题

在ubuntu:16.04 的镜像中,默认是没有cron包的,所以需要手动安装

1
apt-get install -y cron

那么启动任务计划时,不能使用命令 /etc/init.d/cron start 以及 service cron start

在dockerfile中,会启动不成功的。

必须使用 /usr/sbin/cron 命令,才能启动成功!

添加问题

一般来讲,添加任务计划,直接修改 /etc/crontab 文件即可。

在dockerfile 中,不能使用echo EOF 等命令修改/etc/crontab文件

必须使用 sed 命令修改/etc/crontab文件,才能成功!

如果需要在最后一行添加任务计划,可以使用以下命令:

语法:

1
sed -i '$a需要添加的内容' 文件名

比如:

1
sed -i '$a* * * * * root python3 /messagecenter/cron/voc_receipt.py' /etc/crontab

五、封装Django项目镜像

新建空目录

1
mkdir /opt/messagecenter

目录结构如下:

1
2
3
4
5
./
├── dockerfile
├── messagecenter.tar
├── run.sh
└── sources.list

dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM ubuntu:16.04
# 修改更新源为阿里云
ADD sources.list /etc/apt/sources.list
ADD messagecenter.tar /
# 时区为上海
ENV TZ Asia/Shanghai

# 设置时区,设置utf-8编码,安装django,添加任务计划
RUN apt-get update && apt-get install -y tzdata locales python3-pip cron && apt-get clean all && \
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
locale-gen en_US.UTF-8 && \
pip3 install django requests

# 解决中文乱码问题
#RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

EXPOSE 8000
# 添加启动脚本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

messagecenter.tar 这个是Django项目,已经打成tar包了。在dockerfile中,执行ADD命令时,会自动解压tar包

run.sh

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

# 启动任务计划
/usr/sbin/cron

# 最后一行增加任务计划
sed -i '$a* * * * * root python3 /messagecenter/cron/voc_receipt.py' /etc/crontab

# 启动django项目
cd /messagecenter/
python3 manage.py runserver 0.0.0.0:8000

在Django项目中,有一个python脚本,需要每分钟执行一次!

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu xenial-security main restricted
deb http://mirrors.aliyun.com/ubuntu xenial-security universe
deb http://mirrors.aliyun.com/ubuntu xenial-security multiverse

生成镜像

1
docker build -t messagecenter /opt/messagecenter

启动镜像

1
docker run -d -it -p 8000:8000 messagecenter

访问页面:

1
http://192.168.0.162:8000

就可以访问Django的默认页面了!

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用nginx反向代理后如何获取客户端ip

发表于 2020-09-23

一、nginx 反向代理

nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。

nginx反向代理配置时,一般会添加下面的配置:

1
`proxy_set_header Host $host;``proxy_set_header X-Real-IP $remote_addr;``proxy_set_header REMOTE-HOST $remote_addr;``proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`

1. proxy_set_header X-real-ip $remote_addr;

这句话之前已经解释过,有了这句就可以在web服务器端获得用户的真实ip

但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。

2. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute(“X-Forwarded-For”)获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:

1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute(“X-Forwarded-For”)获得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包含客户端请求头中的”X-Forwarded-For”,与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

在第一台nginx中,使用 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的”X-Forwarded-For”部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说了,默认的这个X-Forwarded-For是为空的,所以当我们直接使用proxy_set_header X-Forwarded-For $http_x_forwarded_for时会发现,web服务器端使用request.getAttribute(“X-Forwarded-For”)获得的值是null。如果想要通过request.getAttribute(“X-Forwarded-For”)获得用户ip,就必须先使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;这样就可以获得用户真实ip。

二、Java获取客户端真实IP地址

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.javapeixun.com.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

于是可得出获得客户端真实IP地址的方法一:

1
`public` `String getRemortIP(HttpServletRequest request) { ``  ``if` `(request.getHeader(``"x-forwarded-for"``) == ``null``) { ``    ``return` `request.getRemoteAddr(); ``  ``} ``  ``return` `request.getHeader(``"x-forwarded-for"``); ``}`

可是当我访问http://www.5a520.cn /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:X-Forwarded-For: unknown

于是可得出获得客户端真实IP地址的方法二:

1
`public` `String getIpAddr(HttpServletRequest request) { ``  ``String ip = request.getHeader(``"x-forwarded-for"``); ``  ``if``(ip == ``null` `|| ip.length() == ``0` `|| ``"unknown"``.equalsIgnoreCase(ip)) { ``    ``ip = request.getHeader(``"Proxy-Client-IP"``); ``  ``} ``  ``if``(ip == ``null` `|| ip.length() == ``0` `|| ``"unknown"``.equalsIgnoreCase(ip)) { ``    ``ip = request.getHeader(``"WL-Proxy-Client-IP"``); ``  ``} ``  ``if``(ip == ``null` `|| ip.length() == ``0` `|| ``"unknown"``.equalsIgnoreCase(ip)) { ``    ``ip = request.getRemoteAddr(); ``  ``} ``  ``return` `ip; ``}`

可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?

答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

mysql百万数据字符串匹配查询速度优化之覆盖索引法

发表于 2020-09-23

什么是“索引覆盖”?

简单来的说,就是让查询的字段(包括where子句中的字段),都是索引字段。索引覆盖的好处是什么?好处是极大的、极大的、极大的提高查询的效率!重要的说三遍!

特别说明:

  1. where条件中如果使用like关键词,即使字段是索引中的,也不构成索引覆盖。
  2. 单个字段的索引,对于搜索单个where条件有较好的效果。但索引覆盖需要使用多字列索引。

假设创建一个zaho_user表:

1
2
3
4
5
6
7
 CREATE TABLE `zaho_user` (
`u_id` int(11) NOT NULL AUTO_INCREMENT,
`insert_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`u_name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
`u_sex` tinyint(4) NOT NULL DEFAULT '1' COMMENT '性别',
`u_desc` varchar(200) NOT NULL DEFAULT '' COMMENT '介绍'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '用户表';

这里我们创建一个索引:

1
alter table `zaho_user` add index (`u_name`,`insert_time`,`u_sex`);

那么,我们执行如下查询时,效率将会非常高:

1
select `u_name`,`insert_time` from `zaho_user` where `u_sex`=1

例子中的三个字段:u_name,insert_time,u_sex创建了一个多列索引,而SQL查询时形成了索引覆盖。 在百万数据量匹配查询时速度提升非常可观

网站速度优化

为什么网站访问很慢, 想优化可以参考以下方式, 优先级由高到低:

  1. 数据库位置优化 (优先采用内网访问而非外网)
  2. 硬盘优化 (优先固态硬盘)
  3. SQL语句优化
  4. 服务器硬件和外网带宽升级
  5. 应用代码优化
  6. 定期重启mysql 连接优化 (亲测效果明显)

网站维护记录

本人有一个博客采集站, 内置文章3万左右, 访问和渲染速度非常快, 后来爬取文章增量到6万左右, 感觉网站速度明显变慢, 起初以为是内容过多导致, 可是也才6万就这么慢了那百万数据岂不没法玩了

我甚至在想 可能是服务器配置以及博客程序有限导致的 也没再管它

直到有一天 数据库容器挂了 , 重启数据库后, 网站恢复访问, 速度竟惊人地变快, 和最开始没两样, 于是乎我否断了之前的猜测, 之前速度慢有可能仅仅是数据库连接过多 垃圾缓存导致的

因此 定期重启数据库 似乎可以纳入我的定时任务计划中

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…343536…48

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

479 日志
139 标签
RSS
© 2024 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%