现实中很多项目的瓶颈最终都会落在数据库上。
刨除缓存和服务器配置差异,同样的配置,好的数据库设计能比劣质设计性能高出n倍,视觉上也会更有美感。

不讨论过多的细节,对于数据库优化主要有一下几个要点:

1、数据库结构优化:分库、分表、分区

  • 分区是一种简单的水平拆分,只需要在表结构设计时加上分区参数,不需要代码管理。分区可以让单表的存储量更多,也可以提高检索的速度。
  • 分表就是把一张大表,按照不同的规则分成多张小表,通常有垂直拆分和水平拆分两种,适合各个表之间关联度不高的场景。
  • 分库就是把一个数据库按照不同的规则或者业务需求分成多个库,像游戏的不同服、saas平台的不同商家端。

2、表结构优化

  • 使用可存下数据的最小数据类型
  • 尽可能不用null,数组可以用0代替,字符串可以用''代替
  • 尽量少用text,非用不可时尽量放在分表
  • 单表不要有太多字段,建议20个以内
  • 确定长度的字段用固定长度表,检索速度更快
  • 同一模块的表尽可能使用相同的前缀,表名尽可能表达含义
  • 所有字段名称都用小写字母,多词用"_"连接

3、索引优化

  • 选择离散度大的列做索引
  • 索引字段越小越好
  • 适当建立联合索引,离散度大的列放在联合索引前面
  • 索引不是越多越好,建立索引要适当

4、sql语句优化

  • 查看慢查询日志
  • 用explain分析sql的执行计划
  • 减少大表之间的join
  • 避免用select *,列出需要的查询字段即可
  • 避免or连接词,可以的话用IN代替
  • 避免在sql语句中进行列运算
  • 避免使用左侧模糊查询

5、存储引擎优化

  • 无特别要求存储引擎都使用innodb
  • innodb为行锁插入性能更优
  • 如果事务操作里面有包含mysiam引擎的表,会使事务失

另外就是一些比较琐碎的优化项了,比如,尽量不在循环中进行数据库操作,尽量减少查询数据库的次数、添加数据库连接池、必要的时候使用中间件解决异表间的搜索排序问题。

众所周知,操作系统的cache和buff机制极大的提升了系统运行效率,
cache是介于cpu和内存之间的缓冲区,主要用于读缓冲,
buff是介于硬盘和内存之间的缓存区,主要用于写缓存,
然鹅,如果cache和buff占用的内存过高也会影响系统运行速度,
我们可以通过以下命令查看缓存占用情况

free -mh

如下图,该操作系统总内存1.8G,缓存就占了1.4G
WX20210902-092355.png

执行以下命令清理缓存空间

echo 3 > /proc/sys/vm/drop_caches

以下是清理完后的状况
2.png

缓存就降到了251M

相信很多phper们在使用composer添加新插件的时候,会碰到这个问题:”明明这次要安装的是一个新插件,结果提示其他插件安装报错“。
类似的报错如:

Your requirements could not be resolved to an installable set of packages.
Problem 1
    - phpoffice/phpspreadsheet is locked to version 1.7.0 and an update of this package was not requested.
    - phpoffice/phpspreadsheet 1.7.0 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
  Problem 2
    - topthink/think-installer v2.0.0 requires composer-plugin-api ^1.0 -> found composer-plugin-api[2.1.0] but it does not match the constraint.
    - topthink/framework v5.1.23 requires topthink/think-installer 2.* -> satisfiable by topthink/think-installer[v2.0.0].
    - topthink/framework is locked to version v5.1.23 and an update of this package was not requested.

其实要解决这个问题很简单,只需要执行一下代码:

composer install --ignore-platform-reqs

composer update --ignore-platform-reqs

忽略掉composer的版本匹配,这样就可以继续正常安装新的包了,快去试试吧

都说网络爬虫就用python,但我不这么认为。
尤其是对于熟悉php又对python生疏的coder来说,其实完全不比舍近求远。
只要插件用的好,就没有php办不了的事儿,今天要给大家介绍的这款插件是PHP Simple HTML DOM Parser,html页面解析插件,效率之高,令人拍手叫绝(偷笑),而且操作简便,可以像jquery一样去获取html标签。实在是居家旅行,页面抓取,必备神器。

相关资源

操作手册:https://simplehtmldom.sourceforge.io/manual.htm
下载地址:https://sourceforge.net/projects/simplehtmldom/files/

获取远程地址html元素

// 新建一个dom实例
$html = file_get_html('http://www.baidu.com/');

// 获取所有img标签
foreach($html->find('img') as $element)
  echo $element->src . '<br>';

// 获取所有连接
foreach($html->find('a') as $element)
  echo $element->href . '<br>'; 

直接操作html字符串

// 根据字符串创建dom实例
$html = str_get_html('<html><body>Hello!</body></html>');

获取单个元素

// 获取第一个a标签元素
$ret = $html->find('a', 0);

// 获取最后一个a标签元素
$ret = $html->find('a', -1); 

获取元素值

// 创建Dom实例
$html = file_get_html('http://www.baidu.com/');

// 获取所有a标签的链接地址
foreach($html->find('a') as $e) 
    echo $e->href . '<br>';

// 获取所有img标签的src地址
foreach($html->find('img') as $e)
    echo $e->src . '<br>';

// 获取所有的img标签内容
foreach($html->find('img') as $e)
    echo $e->outertext . '<br>';

// 获取标签id=gbar的div标签内容
foreach($html->find('div#gbar') as $e)
    echo $e->innertext . '<br>';

// 获取标签id=gbar的div标签的文本信息
foreach($html->find('div#gbar') as $e)
    echo $e->plaintext . '<br>';

如何操作Dom树

// 示例
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;



- 阅读剩余部分 -

下载安装文件

到mysql官网找到5.7的下载地址:https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz

    //下载mysql压缩包
    cd /usr/local/
    wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz

   //解压缩
   tar -xvzf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz

处理旧版mysql

//关闭mysql服务
service mysqld stop

//备份mysql5.6
mv /usr/local/mysql /usr/local/mysql5.6

安装mysql5.7

//修改目录名
mv /usr/local/mysql-5.7.33-linux-glibc2.12-x86_64 /usr/local/mysql

//创建data目录,mysql5.7.33默认没有这个文件
mkdir /usr/local/mysql/data

//安装mysql5.7
/usr/local/mysql/bin/mysqld --initalize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

安装完mysql,注意看最后一行root密码
WX20211006-170928.png


//启动mysql
service mysqld start

修改密码

//登录mysql
mysql -uroot -ppwd

//修改密码
alter user 'root'@'localhost' identified by 'new passwd';
flush privileges;

自此mysql升级完成。


- 阅读剩余部分 -