两个容易被忽略的MySQL知识

本文详细解析了MySQL中VARCHAR类型的存储特性,特别是在不同版本间的变化,并对比了LIMIT的不同使用方式及其性能影响。
1、varchar(5)可以存储多少个汉字,多少个字母数字?
  相信有好多人应该跟我一样,对这个已经很熟悉了,根据经验我们能很快的做出决定,比如说用varchar(200)去存储url等等,但是,即使你用了很多次也很熟悉了,也有可能对上面的问题做出错误的回答。
  这个问题我查了好多资料,有的人说是可以存储5个字符,2.5个汉字(每个汉字占用两个字节的话),有的人说这个要区分版本,5.0是个分界限,5.0之前是前面说的那样,5.0之后是可以存储5个“字”,不区分是数字、英文、汉字,果真是这样吗,我们来做个实验:
  CREATE TABLE `test` (
  `name` varchar(5) NOT NULL DEFAULT '',
  `info` char(5) NOT NULL DEFAULT '',
  PRIMARY KEY (`name`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  可以看出varchar(5)中的5代表的是5个“字”,而不是5个字节(bytes),当我们存储长度超过制定长度的时候会将超过的部分“咔嚓”掉,我的mysql版本是5.6,字符集(charset)utf8和gbk是一样的。
  其他版本我电脑上没有,去官方文档看看有没有什么说明,在官方文档中查了半天终于发现了点区别:
  下面这段来自http://dev.mysql.com/doc/refman/4.1/en/char.html,是对mysq4.1的说明:
  The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters. (Before MySQL 4.1, the length is interpreted as number of bytes.)
  再看看其他版本的类似的说明:
  The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.
  显而易见了,官方文档说了,mysql版本小于4.1的时候存储的时候符合说法:varchar(5)保存5个bytes,及5个英文数字或者2.5个汉字(假设一个汉字2个字节);
  mysql版本大于等于4.1的时候varchar(5)中的5不再是字节数了,应该理解为“字”这里的字的意思是一个汉字和一个英文或者数字“相同对待”
  2、mysql中的limit,你真的会用吗?
  你在项目中怎么使用limit?limit num?还是limit num1,num2?还是其他的?要知道limit使用不同的形式性能差距很大的。
  我自己测试了下,在一张innodb表中去使用limit,表中10000条数据,四个字段,id(int)、time(int)、title(varchar)、body(mediumtext),大小大约170M左右,首先关掉查询缓存,免得查询缓存对查询时间有影响,这里要注意time字段上面加了索引,
  SET @@query_cache_type=ON;
  SET GLOBAL query_cache_size=0;
  打开Query profiler来查看语句执行所花费的时间
  set profiling=1;
  接下来对下面几个语句进行执行
  a、SELECT id,TIME,title FROM cnblogs WHERE TIME>=1315646940 ORDER BY TIME ASC LIMIT 2000,10
  b、SELECT id,TIME,title FROM cnblogs WHERE TIME>=1315646940 ORDER BY TIME ASC LIMIT 10
  c、 SELECT id,TIME,title FROM cnblogs ORDER BY TIME ASC LIMIT 3000,10
  执行顺序a,b,c,a,b,c,c,a,a(这里需要注意下,虽然我关闭了缓存,但是上一次的查询还是会缓存,这个可以从Query profiler中看出来,所以进行交叉执行),使用下面的语句查看结果
  SHOW profiles;
  从上面的语句执行时间分析可以看出,不考虑缓存因素,当使用limit的时候,"limit begin,num"这种形式比"limit num"这种形式效率低很多,因此,在使用的时候尽可能的使用第二种形式,比如说要循环获取一个表里面的数据,一次取出来内从放不下,这个时候就要按照id(或者其他排序字段)进行limit了,我们就可以通过获取上次的该字段临界值作为下次取数据的最小值,使用limit num这种形式效率会高很多。
<think>好的,我现在需要回答用户关于如何结合使用tasklist和findstr命令查找包含'mysql'的进程的问题。首先,我得回忆这两个命令的基本用法以及它们如何一起工作。 用户提到的是Windows命令,tasklist用于列出正在运行的进程,而findstr则是用来搜索字符串的工具。结合使用这两个命令,可以通过管道将tasklist的输出传递给findstr进行过滤,找到特定进程。 首先,我应该写出基本的命令结构:tasklist | findstr "mysql"。这可能就能达到用户的需求。但需要确认这个命令是否有效,以及是否需要任何参数。例如,是否需要考虑大小写?默认情况下,findstr是区分大小写的,所以如果进程名可能有不同的大小写组合,可能需要加上/i选项来忽略大小写。 然后,是否需要详细说明每个参数的作用?比如,/i的作用,或者是否需要使用其他选项如/v来反向搜索。不过用户的问题只是查找包含'mysql'的进程,所以可能不需要涉及反向搜索。但为了全面,可以提到这些选项,让用户知道更多的可能性。 接下来,考虑到用户可能对命令行不太熟悉,应该分步骤解释命令的每个部分。比如,tasklist单独运行会列出所有进程,然后通过管道符|将结果传给findstr进行筛选。这时候,findstr会逐行查找包含"mysql"的行,并输出这些行。 另外,用户可能需要知道如何获取更详细的信息,比如使用tasklist的/v选项来显示详细输出,或者使用其他格式,比如/csv,这样可能会影响findstr的搜索方式。例如,如果使用/csv格式,列之间会用逗号分隔,此时可能需要调整搜索的关键词,比如包括进程名所在的列中的内容。 还有,是否需要考虑进程的其他属性,比如映像名称、PID等?比如,用户可能不仅想通过映像名称查找,还可能想通过窗口标题或其他字段。这时候可能需要使用tasklist的更多参数,或者调整findstr的搜索模式,例如使用正则表达式来更精确地匹配。 此外,可能需要给出一些示例,比如当使用tasklist /fi "imagename eq mysql*"时,是否能直接过滤,但有时候可能不如结合findstr灵活,特别是当进程名不完全匹配或有多个部分包含mysql的情况。 还需要检查是否有权限问题,比如某些进程可能需要管理员权限才能查看。因此,在命令提示符中是否需要以管理员身份运行。例如,如果用户没有权限,可能无法看到所有进程,这时候需要提示用户使用管理员权限运行命令行。 另外,是否有常见的错误情况需要提醒用户?例如,如果没有任何进程包含mysql,findstr会不输出任何内容,或者如果拼写错误,比如mysql写成MySQL,而没加/i参数,可能导致找不到进程。这时候需要强调/i参数的重要性,尤其是在不确定进程名大小写的情况下。 最后,是否需要提到如何终止找到的进程?比如结合taskkill命令,使用PID来终止进程。虽然用户当前的问题只是查找,但可能后续会有这样的需求,可以作为一个扩展知识点简要提及,但不要偏离用户的主要问题。 总结一下,回答的步骤应该是: 1. 写出基本命令:tasklist | findstr "mysql" 2. 解释每个部分的作用:tasklist列出进程,管道符传递数据,findstr过滤 3. 提到忽略大小写的参数/i 4. 可能的扩展用法,如使用csv格式或其他参数 5. 示例输出,让用户知道预期结果 6. 提醒可能需要管理员权限 7. 可能的错误排查,如大小写问题,无结果的情况 8. 扩展:如何终止找到的进程(可选) 现在需要确保这些步骤清晰,并且语言简洁,符合用户的要求。同时要引用相关的参考资料,比如站内引用中的tasklist和findstr的使用示例,比如引用5中提到tasklist的远程使用,但用户的问题可能更关注本地进程,所以可能不需要涉及远程参数。引用2和4提到findstr的功能,可以引用这些说明findstr的用途。 需要检查是否有引用需要标注,比如关于findstr和tasklist的基本用法,但用户提供的引用中,引用5提到了tasklist的使用示例,引用2和4提到了findstr的一些功能,所以在回答中可以引用这些来支持说明。 例如,在解释tasklist时,可以引用[^5]中的示例,说明tasklist的基本用法。在解释findstr时,可以引用[^2]和[^4]中提到的findstr的字符串搜索功能。 另外,用户的问题中引用的部分有些是关于find和findstr的比较,比如引用2指出find可以统计行数和处理Unicode文本,而findstr不能直接统计,但用户的问题中不需要这些功能,所以可能不需要提及,除非对比两者的不同,但用户明确要求使用findstr,所以可以忽略这部分。 现在,将上述思考整理成一个结构化的回答,分步骤说明如何使用命令,并给出示例。同时,确保使用正确的中文表达,避免技术术语错误,并检查LaTeX格式是否符合要求,不过在这个问题中可能不需要数学公式,所以主要关注命令的正确格式,用反引号包裹代码块。 可能的示例命令: 1. 基本命令: ``` tasklist | findstr /i "mysql" ``` 解释:/i忽略大小写,确保找到MySQLmysql等变体。 2. 如果需要更详细的信息,可以使用: ``` tasklist /v | findstr /i "mysql" ``` 这里/v参数让tasklist显示详细进程信息,包括窗口标题,可能有助于找到更多相关信息。 3. 如果需要以CSV格式输出,可能更适合后续处理: ``` tasklist /fo csv | findstr /i "mysql" ``` 然后,给出一个示例输出,例如: ``` mysql.exe 1234 Services 0 10,000 K ``` 解释输出中的各个部分:映像名称、PID、会话名、会话号、内存使用。 最后,提醒用户可能需要管理员权限,以及如何终止进程,例如: ``` taskkill /pid 1234 /f ``` 引用[^3]中提到的taskkill用法。 现在将这些步骤整合成一个流畅的回答,并添加引用标记。</think>以下是如何在Windows系统中使用`tasklist`和`findstr`命令组合查找包含“mysql”进程的步骤: --- ### **步骤说明** 1. **打开命令提示符** 按 `Win + R` 输入 `cmd` 并回车,或直接搜索“命令提示符”。 2. **输入组合命令** ```cmd tasklist | findstr /i "mysql" ``` - `tasklist`:列出所有正在运行的进程。 - `|`(管道符):将`tasklist`的输出传递给`findstr`。 - `findstr /i`:忽略大小写搜索包含“mysql”的行[^2]。 3. **解读输出结果** 示例输出: ``` mysql.exe 1234 Services 0 10,000 K ``` - **映像名称**:进程名称(如 `mysql.exe`)。 - **PID**:进程标识符(如 `1234`)。 - **内存使用**:进程占用的内存(如 `10,000 K`)。 4. **扩展用法** - **显示详细进程信息**: ```cmd tasklist /v | findstr /i "mysql" ``` `/v` 参数显示进程的窗口标题和启动时间。 - **按CSV格式过滤**: ```cmd tasklist /fo csv | findstr /i "mysql" ``` `/fo csv` 以逗号分隔的格式输出,方便进一步处理[^5]。 --- ### **注意事项** - **管理员权限**:若未看到目标进程,尝试以管理员身份运行命令提示符。 - **终止进程**:若需终止找到的进程,使用 `taskkill /pid [PID] /f`(如 `taskkill /pid 1234 /f`)[^3]。 - **模糊匹配**:若进程名不完全匹配,可使用通配符(如 `findstr /i "mysq*"`)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值