diff --git a/Day61-65/code/image360/image360/middlewares.py b/Day61-65/code/image360/image360/middlewares.py index 10b3224689e1c5efc73fbe2c2f5c453b4efe7fa4..2516a38129dbbb40473bff875aecc25694a7a1d0 100644 --- a/Day61-65/code/image360/image360/middlewares.py +++ b/Day61-65/code/image360/image360/middlewares.py @@ -112,11 +112,15 @@ class TaobaoDownloaderMiddleWare(object): def __init__(self, timeout=None): self.timeout = timeout # options = webdriver.ChromeOptions() - # options.add_argument('headless') + # options.add_argument('--headless') # self.browser = webdriver.Chrome(options=options) - self.browser = webdriver.Chrome() + options = webdriver.ChromeOptions() + options.add_argument('--headless') + self.browser = webdriver.Chrome(options) self.browser.set_window_size(1000, 600) - self.browser.set_page_load_timeout(self.timeout) + self.browser.implicitly_wait(10) + # self.browser.add_cookie({}) + # self.browser.set_page_load_timeout(self.timeout) def __del__(self): self.browser.close() @@ -124,6 +128,7 @@ class TaobaoDownloaderMiddleWare(object): def process_request(self, request, spider): try: self.browser.get(request.url) + # Chrome对象的page_source代表了页面的HTML代码(带动态内容) return HtmlResponse(url=request.url, body=self.browser.page_source, request=request, encoding='utf-8', status=200) except TimeoutException: diff --git "a/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" "b/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" index 815f2a2c2533d890d8a585dac608020db7e44643..22d656517c31d0392d2e98246cf233fe70bb6c58 100644 --- "a/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" +++ "b/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" @@ -1,5 +1,38 @@ ## MySQL性能优化 +### 基本原则 + +想要发挥 MySQL 的最佳性能,需要遵循 3 个基本使用原则。 + +1. 让MySQL回归存储的基本职能:MySQL 数据库只用于数据的存储,不进行数据的复杂计算,不承载业务逻辑,确保存储和计算分离; +2. 查询数据时,尽量单表查询,减少跨库查询和多表关联; +3. 杜绝大事务、大 SQL、大批量、大字段等一系列性能杀手。 + - 大事务:运行步骤较多,涉及的表和字段较多,容易造成资源的争抢,甚至形成死锁。一旦事务回滚,会导致资源占用时间过长。 + - 大 SQL:复杂的SQL意味着过多的表的关联,MySQL 数据库处理关联超过3张表以上的SQL时,占用资源多,性能低下。 + - 大批量:多条SQL一次性执行完成,可以减少一条条执行SQL产生的额外开销,但必须确保进行充分的测试,并且在业务低峰时段或者非业务时段执行。 + - 大字段:blob、text类型的大字段要尽量少用,必须要用时,尽量与主业务表分离,减少对这类字段的检索和更新。 + +### 建库建表 + +1. 必须指定默认存储引擎为 InnoDB,并且禁用 MyISAM 存储引擎,随着 MySQL 8.0 版本的发布,所有的数据字典表都已经转换成了 InnoDB,MyISAM 存储引擎已成为了历史。 +2. 默认字符集 UTF8mb4,以前版本的 UTF8 是 UTF8mb3,未包含个别特殊字符,新版本的 UTF8mb4 包含所有字符,官方强烈建议使用此字符集。 +3. 关闭区分大小写功能。设置参数`lower_case_table_names`的值为`1`,即可关闭区分大小写功能,即大写字母 T 和小写字母 t 一样。 +4. 存储过程、触发器、视图、event等功能尽量在程序中实现,一方面是为了存储和计算分离,另一方面是因为这些功能非常不完整,调试、排错、监控都非常困难,相关数据字典也不完善,存在潜在的风险。一般在生产数据库中,禁止使用。 +5. 单个数据库实例表数量控制在2000个以内。 + +#### InnoDB表的注意事项 + +1. 主键列使用`unsigned`整数,可以使用`auto_increment`,但是要禁止手动更新主键。 +2. 每个列都必须添加`comment`注释。 +3. 在建表时必须显示指定`engine`。 +4. 表必备三字段:`xxx_id`、 `xxx_create`、 `xxx_modified`。其中`xxx_id`为主键,类型`unsigned`整数类型(例如:`int unsigned`);`xxx_create`、`xxx_modified`的类型均为`datetime`类型,分别记录该条数据的创建时间、修改时间。 +5. 所有字段必须指定`not null`,为空值指定`default`值,因为MySQL难以优化`null`值,含`null`值的复合索引会失效,最终导致查询效率低。 +6. 单张表的字段数尽量空值在50个字段以内,如果字段过多可以考虑垂直拆分。 +7. 禁用`enum`和`set`类型,因为这样的类型兼容性不好且性能较差。 +8. 大文件不应该使用`blob`类型而是保存它们的路径,`blob`和`text`这样的类型会导致处理性能下降,全表扫描代价大大增加。 +9. 对货币等对精度敏感的数据,应该使用定点数(`decimal`)而不是浮点数(`float`)。 +10. 保存IP地址不要用`char(15)`,应该使用`int unsigned`,可以使用`inet_aton`和`inet_ntoa`函数实现整数和IP地址的转换。 + ### 使用索引 在前面[《关系型数据库MySQL》](../Day36-40/36-38.关系型数据库MySQL.md)一文中,我们已经讲到过索引的相关知识,这里我们做一个简单的回顾。