MYSQL SQL 使用binary导致索引失效的问题分析与总结

2024-7-24 杜世伟 Mysql

在 MySQL 中,是否使用索引取决于查询的具体情况。以下是几个关键点,决定查询是否使用索引:

1. 查询条件:如果查询条件中的列有索引,并且查询能够利用这些索引,那么 MySQL 会尝试使用索引。例如,`WHERE` 子句中的条件列有索引。
2. 查询类型:对于一些特定类型的查询,如 `SELECT`、`UPDATE` 或 `DELETE`,MySQL 会尝试使用索引来优化查询性能。
3. 索引类型:
   - B-Tree 索引:默认情况下,MySQL 使用 B-Tree 索引。对于等值查询、范围查询等都能有效利用。
   - 全文索引:用于全文搜索。
   - 哈希索引:仅适用于 Memory 引擎,用于等值查询。
4. 数据类型:索引的使用也取决于列的数据类型和索引类型是否匹配。例如,`BINARY` 数据类型的列如果有 B-Tree 索引,在等值查询时可以有效使用。
5. 查询优化器:MySQL 查询优化器决定是否使用索引。它会根据查询的成本估算(例如全表扫描 vs. 使用索引扫描)来决定是否使用索引。你可以使用 `EXPLAIN` 语句查看查询的执行计划,确定 MySQL 是否使用了索引。

阅读全文>>

评论(0) 浏览(6237)

架构设计中如何高效的实现接口幂等,通用的设计方案和解决方式

2024-5-23 杜世伟 架构

在架构设计中,实现接口幂等性(Idempotence)是为了保证在网络请求重试等情况下,接口的多次调用不会产生副作用。以下是一些通用的设计方案和解决方法,并对它们的优缺点进行比较:

1. 幂等键(Idempotency Key)
描述:

客户端生成一个唯一的幂等键,并在请求中携带。
服务器端使用这个幂等键来检查是否已经处理过该请求。
优点:

简单易实现,适用于需要保证请求唯一性的场景。
客户端控制幂等键,方便重试机制。
缺点:

需要客户端实现幂等键生成逻辑。
幂等键存储需要占用服务器存储资源。
适用场景:

金融交易、订单处理等需要确保操作唯一性的系统。

阅读全文>>

标签: 架构 幂等 设计方案

评论(0) 浏览(4901)

nginx 如何在配置文件给静态文件添加缓存

2024-5-23 杜世伟

在 Nginx 中为静态文件添加缓存可以通过设置响应头来实现。这可以通过在 Nginx 配置文件中使用 expires 指令来完成。以下是一个示例配置,展示了如何为特定类型的静态文件(如图像、CSS、JavaScript 文件等)设置缓存头。

假设你的 Nginx 配置文件路径是 /etc/nginx/nginx.conf,你可以在其中添加或修改 server 块来包含缓存配置:

http {
    # 其他全局配置

    server {
        listen 80;
        server_name example.com;

        root /var/www/html;

        location / {
            try_files $uri $uri/ =404;
        }

        # 为图像文件设置缓存
        location ~* \.(jpg|jpeg|png|gif|ico|bmp|webp)$ {
            expires 30d;
            add_header Cache-Control "public, no-transform";
        }

        # 为CSS和JavaScript文件设置缓存
        location ~* \.(css|js)$ {
            expires 7d;
            add_header Cache-Control "public, no-transform";
        }

        # 为字体文件设置缓存
        location ~* \.(woff|woff2|ttf|otf|eot)$ {
            expires 30d;
            add_header Cache-Control "public, no-transform";
        }

        # 为SVG文件设置缓存
        location ~* \.(svg|svgz)$ {
            expires 30d;
            add_header Cache-Control "public, no-transform";
        }

        # 其他静态文件
        location ~* \.(html|htm)$ {
            expires 1h;
            add_header Cache-Control "public, no-transform";
        }

        # 其他配置...
    }
}

在上述配置中:

expires 指令用于设置过期时间,30d 表示30天,7d 表示7天,1h 表示1小时。
add_header Cache-Control 指令用于设置 Cache-Control 响应头,public, no-transform 表示允许所有缓存,且在缓存时不进行转换。

sudo nginx -s reload

这样,Nginx 将为匹配的静态文件添加缓存头,帮助浏览器和中间缓存服务器更好地缓存这些文件,从而提高性能。

标签: nginx expires

评论(0) 浏览(4585)

php serialize_precision 介绍

2023-6-3 杜世伟 Php

serialize_precision 是 PHP 中的一个配置选项,它决定了在序列化浮点数时使用的精度。该选项对于确保浮点数在序列化和反序列化过程中不丢失精度非常重要。

serialize_precision 的详细介绍

含义和作用

serialize_precision 设置在使用 serialize() 函数时,PHP 对浮点数序列化的精度。序列化是将数据结构(如数组和对象)转换为字符串的过程,以便存储或传输。反序列化是相反的过程,将字符串转换回原始数据结构。

默认值

在 PHP 7.1 之前,serialize_precision 的默认值是 17。这意味着在序列化浮点数时,最多使用 17 位精度。

从 PHP 7.1 开始,默认值变为 -1。这意味着 PHP 会使用足够的精度来确保浮点数在序列化和反序列化后保持其值。

配置方法

你可以在 php.ini 文件中设置 serialize_precision,也可以在运行时使用 ini_set() 函数设置。

在 php.ini 中设置

serialize_precision = -1

在运行时设置

ini_set('serialize_precision', -1);

示例

// 设置 serialize_precision 为 14
ini_set('serialize_precision', 14);

$data = 0.12345678901234;
$serialized_data = serialize($data);
echo $serialized_data;
// 输出: d:0.12345678901234;

$data = 0.12345678901234567890;
$serialized_data = serialize($data);
echo $serialized_data;
// 输出: d:0.12345678901235; (由于精度限制被舍入)

// 使用默认值 (-1)
ini_set('serialize_precision', -1);

$serialized_data = serialize($data);
echo $serialized_data;
// 输出: d:0.12345678901234568;

重要性

设置 serialize_precision 为 -1 可以确保 PHP 在序列化浮点数时使用最大的精度,从而避免由于浮点数精度丢失导致的问题。这在涉及金融计算或科学计算等需要高精度的场景中尤其重要。

总结
serialize_precision:决定浮点数序列化时的精度。
默认值:PHP 7.1 及以后版本为 -1,之前版本为 17。

重要性:在需要高精度的场景中,设置 serialize_precision 为 -1 以确保浮点数精度不会丢失。

通过正确配置 serialize_precision,可以确保浮点数在序列化和反序列化过程中保持精度,避免潜在的计算错误和数据损失。

标签: PHP

评论(0) 浏览(7573)

Git 合并commit记录

2023-2-13 杜世伟 git

在Git中合并commit记录是一个常见的需求,特别是在需要整理提交历史或合并多个小更改以保持项目历史清晰时。以下是合并commit记录的详细步骤,包括使用git rebase命令的方法:

1. 确定要合并的commit范围
首先,你需要确定哪些commit需要被合并。这通常通过git log命令来完成,你可以使用--oneline参数来简化输出,使其更易于阅读。

git log --oneline
找到你想要合并的commit的哈希值(commit ID)和范围。

2. 使用git rebase -i命令合并commit
Git的rebase命令提供了交互式模式(-i),允许你重新排序、修改或合并提交。

git rebase -i <start-commit-id>~<number-of-commits>
或者,如果你想要合并从某个commit开始到当前HEAD的所有commit,可以使用:

git rebase -i <start-commit-id>^
注意:<start-commit-id>是你想要合并的commit列表中的第一个commit的哈希值,^符号表示该commit之前的提交(即不包括该commit本身)。<number-of-commits>是你想要合并的commit数量。

阅读全文>>

标签: git push commit rebase

评论(0) 浏览(143)

Docker 那些事

2022-9-2 杜世伟 docker

Docer 简介

Docker是基于Go语言实现的开源容器项目。它诞生于2013年年初,最初发起者是dotCloud公司。Docker自开源后受到业界广泛的关注和参与,目前已有80多个相关开源组件项目(包括Containerd、Moby、Swarm等),逐渐形成了围绕Docker容器的完整的生态体系。

Docker的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。

Docker 解决的问题

由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。

Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。

Docker-kernel

Docker在开发和运维中的优势

  • 更快速的交付和部署
  • 更高效的资源利用
  • 更轻松的迁移和扩展
  • 更简单的更新管理

阅读全文>>

标签: docker

评论(0) 浏览(1869)

欢迎您关注“刘善海价值分享”微信公众号!

2022-2-6 杜世伟 Message

本公众号的初心是 “让企业管理者少走冤枉路”,使命是“让大家思想成就您的卓越与美好”,她旨在

①原汁原味地呈现一些管理大家、管理大师的思想,甚或是伟人的核心思想中对企业管理有深远意义和长远价值的部分;

②深度解析、解码、精炼一些经典思想,升级为更适合当下、更易于理解、更易于掌握的管理方法;

③分享一些企业高质量发展的案例。她把“成为您高质量发展道路上的忠信伙伴”作为愿景,并一以贯之地呈现出“激情-奉献-合作-感恩”的生命生态,从而让她的绵薄之力汇集到实现中华民族复兴的磅礴伟力中。

本公众号适合于各级企业管理者,它能为企业的高质量发展提供些思想理论基础和行动参考。

标签: 价值分享

评论(0) 浏览(5122)

Module build failed (from ./node_modules/sass-loader/dist/cjs.js):

2020-7-7 杜世伟 Vue

Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
Error: ENOENT: no such file or directory, scandir '/Users/shiwei/Documents/admin-zeus/node_modules/node-sass/vendor'
    at Object.readdirSync (fs.js:785:3)
    at Object.getInstalledBinaries (/Users/shiwei/Documents/admin-zeus/node_modules/node-sass/lib/extensions.js:133:13)
    at foundBinariesList (/Users/shiwei/Documents/admin-zeus/node_modules/node-sass/lib/errors.js:20:15)
    at foundBinaries (/Users/shiwei/Documents/admin-zeus/node_modules/node-sass/lib/errors.js:15:5)
    at Object.module.exports.missingBinary (/Users/shiwei/Documents/admin-zeus/node_modules/node-sass/lib/errors.js:45:5)
    at module.exports (/Users/shiwei/Documents/admin-zeus/node_modules/node-sass/lib/binding.js:15:30)
    at Object.<anonymous> (/Users/shiwei/Documents/admin-zeus/node_modules/node-sass/lib/index.js:14:35)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at getDefaultSassImpl (/Users/shiwei/Documents/admin-zeus/node_modules/sass-loader/dist/index.js:198:10)
    at Object.loader (/Users/shiwei/Documents/admin-zeus/node_modules/sass-loader/dist/index.js:80:29)


使用npm install 安装模板后,没有报错

但是通过npm run dev 启动项目,报上面的错误

这个是因为node-sass没安装好,所以要重新安装
运行命令:npm install node-sass --registry=https://registry.npm.taobao.org

标签: install node-sass vu vue npm

评论(0) 浏览(2878)

Linux vim/vi下backspace(退格键)出现^? 或^H

2019-10-31 杜世伟 Linux

当次删除操作,可以用【ctrl+w】以词为单位删除。一劳永逸的解决办法需按下面进行,二选一。

vim/vi下退格键出现^? (bash下)

方式一:
编辑 .bash_profile 文件,添加一行 stty erase ^? 到最后。执行如下:

vi ~/.bash_profile
stty erase ^?

方式二:
vim/vi下退格键出现^H(csh下)

编辑 .cshrc 文件,添加一行 stty erase ^H 到最后。执行如下:

vi ~/.cshrc
stty erase ^H


p.s.:bash下 检查修改是否成功,输入命令:

stty -a

发现值 erase = ^?; 已经修改成功。

标签: vim vi bash stty backspace

评论(0) 浏览(5720)

python 如何通过subprocess.call调用自定义alias别名

2019-1-20 杜世伟 Python

为了更好的通过Python脚本执行linux命令,通过自定义别名(Alias)进行多个命令组合,然而通过python中如何通过subprocess类库

自定义alias

#alias lt='ls --human-readable --size -1 -S --classify'
alias lt='du -sh * | sort -h'

测试调用的Python代码

from subprocess import call

def test():
    call("lt")

if __name__ == "__main__":
    test()

直接运行上面的代码提示错误信息如下

Traceback (most recent call last):
  File "test_alias.py", line 7, in <module>
    test()
  File "test_alias.py", line 4, in test
    call("lt")
  File "/Users/shiwei/anaconda3/lib/python3.7/subprocess.py", line 323, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/Users/shiwei/anaconda3/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/Users/shiwei/anaconda3/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'lt': 'lt'

通过错误信息可以看出lt命令被当作了文件或目录提示找不到

如果您需要的别名是在 ~/.bashrc 中定义的,可以通过尝试以下几种方式进行运行:

1)你必须给’shell’关键字:

subprocess.call('command', shell=True)

否则,您给定的命令用于查找可执行文件,而不是传递给 shell,它是扩展别名和函数等内容的 shell。

from subprocess import call

def test():
    call("lt", shell=True)

if __name__ == "__main__":
    test()

运行此处代码发现报错找不到文件或目录的错误了,但是出现了新的错误,错误信息如下

# /bin/sh: lt: command not found

有错误信息可以看出还是找不到lt命令,不过不报错误了(此处应该有掌声)

2) 默认情况下,subprocess.call 使用’/bin/sh’ shell。如果这是您要调用的 Bash 别名,则需要使用“可执行”关键字 告诉子进程使用 bash 而不是 sh:

subprocess.call('command', shell=True, executable='/bin/bash')

代码如下

from subprocess import call

def test():
    call("lt", shell=True, executable='/bin/bash')

if __name__ == "__main__":
    test()

通过执行代码发现,报错的错误同上,还是提示lt找到

3) 但是,/bin/bash 除非作为“交互式”shell(使用“-i”)启动,否则不会获取 ~/.bashrc。不幸的是,您不能传递 executable=’/bin/bash -i’,因为它认为整个值是可执行文件的名称。因此,如果您的别名是在用户的正常交互式启动中定义的,例如在 .bashrc 中,您必须使用以下替代形式调用命令:

subprocess.call(['/bin/bash', '-i', '-c', 命令])
# i.e. shell=False (the default)
from subprocess import call

def test():
    call(['/bin/bash', '-i', '-c', 'lt'])

if __name__ == "__main__":
    test()

正常执行,成功调用了alias命令

标签: python subprocess alias

评论(0) 浏览(5371)

Powered by emlog 沪ICP备2023034538号-1