YOLO813

站点地图的优化 - ORM语句的测试

    像笔者这样记忆力一般的人真的很难记住windows系统下的mysql服务的路径,可以在任务管理器中找到数据库运行服务,我安装的是mariadb,找到该服务,然后在详细信息中可以找到该服务的位置所在

    再将其加入到环境变量,下次就可以直接在命令行中使用mysql命令了。

    之前记录过一些备份数据库的命令,但是由于瞎搞出了些问题,例如,备份数据库,如下的操作,直接锁死所有表,生产环境慎用!

mysqldump -uroot -p world_database > /mysql_bak/world_2021.db

    实测不锁表备份:

mysqldump --single-transaction --quick -uroot -p world_database > /mysql_bak/world_2021.db

    如果需要恢复数据库,先建表,再导入,windows上面的方法也是一样的

--恢复数据库
mysqladmin -uroot -p create world_database  (一定要先设置字符集为utf8mb4!!)
mysql -uroot -p world_database < world_2021.db


    制作了250万条测试数据,如果使用的Navicat 16,可以直接右键“自动生成”测试数据,笔者条件有限,采用的是建表之后使用sql语句生成:

delimiter $$
DROP PROCEDURE IF EXISTS proc_batch_insert;
CREATE PROCEDURE proc_batch_insert()
BEGIN
DECLARE pre_name BIGINT;
DECLARE ageVal INT;
DECLARE i INT;
SET pre_name=1898488;
SET ageVal=1000000;
SET i=1;
WHILE i < 2000000 DO
    INSERT INTO my_table(`name`,number,create_time,update_time) VALUES(CONCAT(pre_name,'@168.com'),(ageVal+i),NOW(),NOW());
SET pre_name=pre_name+100;
SET i=i+1;
END WHILE;
END $$

delimiter ;
call proc_batch_insert();


    关于慢日志的查询,可以参考这篇文章

    原本的站点地图文件,很难打开200页之后的页面(如果不差钱,升级服务器配置是最快解决的办法),用程序语言来说,就是偏移量过大导致cpu处理不过来,例如下方站点地图的ORM语句:

Company.objects.only("number","update_time").order_by("id")

翻译成sql

SELECT `id`, `number`, `update_time` FROM `table` ORDER BY `id` ASC LIMIT 5000 OFFSET 1390000

    在笔者的12核cpu的主机上,运行完需要16秒,使用了主键索引

    但是稍微换一种写法,例如:

Company.objects.only("number","update_time").order_by("number")

    笔者都忍不住震惊了!用了一个联合索引,运行时长达到了惊人的0.15秒!我真是不敢相信自己的眼睛,修改了下偏移量,测试结果依旧!