Mysql 自学笔记
- 格式:doc
- 大小:38.00 KB
- 文档页数:8
菜鸟教程 mysql
mysql是一种开源的关系型数据库管理系统。
它是一种用于管
理和处理大量数据的工具,让用户可以方便地存储、访问和操作数据。
mysql是一种常用的数据库系统,被广泛应用于各种Web应用和企业级软件中。
mysql可以通过命令行或图形化界面进行操作。
用户可以使用mysql提供的命令来创建数据库、创建数据表、插入、修改和
删除数据等操作。
mysql使用SQL语言来进行数据操作,在mysql中,可以使用SQL语句来创建和修改数据库中的表结构,还可以使用SQL语句来查询和操作数据库中的数据。
通过mysql,用户可以轻松地进行数据库的管理和维护。
用户
可以使用mysql提供的工具和命令来备份和恢复数据库、优化
查询性能、监控数据库运行状态等。
mysql还提供了丰富的扩
展功能,用户可以根据自己的需求来选择安装和使用不同的插件和扩展。
总结来说,mysql是一种功能强大、易于使用的关系型数据库
管理系统。
它可以满足不同用户的需求,适用于各种规模的应用程序和项目。
通过学习和使用mysql,用户可以高效地进行
数据管理和处理,提升工作效率和数据安全性。
mysql心得体会《MySQL 心得体会》在当今数字化的时代,数据的管理和处理变得至关重要。
作为一名与数据打交道的从业者,我在工作中频繁接触到 MySQL 数据库,并积累了一些宝贵的心得体会。
MySQL 是一个开源的关系型数据库管理系统,因其易用性、性能和广泛的社区支持而备受青睐。
它在众多应用场景中发挥着关键作用,从简单的 Web 应用到复杂的企业级系统。
刚开始接触 MySQL 时,我被它丰富的功能和多样的操作命令所吸引。
创建数据库、表,插入、查询、更新和删除数据,这些基本操作看似简单,但要做到熟练和准确却需要不断的实践。
就拿创建表来说,不仅要考虑字段的数据类型、长度,还要合理设置主键、索引等,以提高数据的存储效率和查询性能。
在实际应用中,我深刻体会到了索引的重要性。
合适的索引可以大大提高查询速度,减少数据库的响应时间。
然而,过度使用索引或者创建不合理的索引也可能会带来负面效果,比如增加数据插入和更新的开销。
因此,在设计数据库结构时,需要根据业务需求和数据访问模式,谨慎地选择和创建索引。
另外,SQL 语句的优化也是提升数据库性能的关键。
一个复杂的查询如果没有经过优化,可能会导致数据库长时间的阻塞,影响整个系统的运行效率。
通过合理使用 JOIN 操作、避免全表扫描、使用合适的函数和条件判断等技巧,可以显著提高 SQL 语句的执行效率。
数据的备份和恢复是数据库管理中不可忽视的环节。
无论是因为硬件故障、人为误操作还是其他意外情况,数据的丢失都可能给业务带来巨大的损失。
MySQL 提供了多种备份和恢复的方法,如使用mysqldump 命令进行逻辑备份,或者通过复制数据文件进行物理备份。
定期进行数据备份,并测试恢复过程的可行性,是保障数据安全的重要措施。
在处理大量数据时,分表和分区也是常用的技术手段。
通过将大表拆分成多个小表,或者按照一定的规则对表进行分区,可以提高数据的管理和查询效率。
但这也增加了数据库设计和维护的复杂性,需要在前期进行充分的规划和设计。
MySQL函数描述、学习总结(适用版本:MySQL 3.23.7alpla)1. MySQL API (2)1.1. MySQL C API (2)1.2. C API数据类型 (3)1.3. C API函数概述 (6)1.4. C API函数描述 (9)1.4.1. mysql_affected_rows() (10)1.4.2. mysql_close() (11)1.4.3. mysql_connect() (11)1.4.4. mysql_change_user() (12)1.4.5. mysql_create_db() (13)1.4.6. mysql_data_seek() (14)1.4.7. mysql_debug() (15)1.4.8. mysql_drop_db() (15)1.4.9. mysql_dump_debug_info() (16)1.4.10. mysql_eof() (17)1.4.11. mysql_errno() (18)1.4.12. mysql_error() (19)1.4.13. mysql_escape_string() (20)1.4.14. mysql_fetch_field() (21)1.4.15. mysql_fetch_fields() (22)1.4.16. mysql_fetch_field_direct() (23)1.4.17. mysql_fetch_lengths() (23)1.4.18. mysql_fetch_row() (24)1.4.19. mysql_field_count() (26)1.4.20. mysql_field_seek() (27)1.4.21. mysql_field_tell() (28)1.4.22. mysql_free_result() (28)1.4.23. mysql_get_client_info() (29)1.4.24. mysql_get_host_info() (29)1.4.25. mysql_get_proto_info() (30)1.4.26. mysql_get_server_info() (30)1.4.27. mysql_info() (30)1.4.28. mysql_init() (31)1.4.29. mysql_insert_id() (32)1.4.30. mysql_kill() (32)1.4.31. mysql_list_dbs() (33)1.4.32. mysql_list_fields() (34)1.4.33. mysql_list_processes() (35)1.4.34. mysql_list_tables() (35)1.4.35. mysql_num_fields() (36)1.4.36. mysql_num_rows() (38)1.4.37. mysql_options() (38)1.4.38. mysql_ping() (40)1.4.39. mysql_query() (41)1.4.40. mysql_real_connect() (41)1.4.41. mysql_real_query() (43)1.4.42. mysql_reload() (44)1.4.43. mysql_row_seek() (45)1.4.44. mysql_row_tell() (45)1.4.45. mysql_select_db() (46)1.4.46. mysql_shutdown() (47)1.4.47. mysql_stat() (47)1.4.48. mysql_store_result() (48)1.4.49. mysql_thread_id() (49)1.4.50. mysql_use_result() (50)1.4.51. 为什么在mysql_query()返回成功后,mysql_store_result()有时返回NULL? (51)1.4.52. 我能从查询中得到什么结果? (51)1.4.53. 我怎样能得到最后插入的行的唯一ID? (52)1.MySQL API1.1. MySQL C APIC API代码是随MySQL分发的,它被包含在mysqlclient库且允许C程序存取一个数据库。
MySQL教案讲解(详细)教案章节:一、MySQL简介1.1 MySQL的历史和发展1.2 MySQL的特点和优势1.3 MySQL的安装和配置二、数据库的基本概念2.1 数据库的概念和分类2.2 数据表的结构和设计2.3 数据库的创建和管理三、SQL语言基础3.1 SQL语言简介3.2 数据定义语言(DDL)3.3 数据操作语言(DML)3.4 数据查询语言(DQL)四、数据库的增删改查操作4.1 数据的插入操作4.2 数据的删除操作4.3 数据的更新操作4.4 数据的查询操作五、索引和约束5.1 索引的概念和作用5.2 索引的创建和管理5.3 约束的概念和作用5.4 约束的添加和删除MySQL教案讲解(详细)教案章节:六、数据库的高级查询6.1 联合查询6.2 子查询6.3 数据汇总和分组6.4 排序和限制七、存储过程和函数7.1 存储过程的概念和作用7.2 存储过程的创建和执行7.3 存储函数的概念和作用7.4 存储函数的创建和执行八、触发器和事件8.1 触发器的概念和作用8.2 触发器的创建和管理8.3 事件的调度和管理8.4 事件和触发器的应用案例九、事务管理9.1 事务的概念和特性9.2 事务的控制和处理9.3 事务的提交和回滚9.4 事务的管理和优化十、MySQL性能优化10.1 查询性能的影响因素10.2 索引优化和选择10.3 查询缓存的使用和管理10.4 数据库的备份和恢复MySQL教案讲解(详细)教案章节:十一、数据库的安全性和权限管理11.1 用户权限的概念和作用11.2 用户权限的分配和管理11.3 角色和角色的使用11.4 安全性和权限管理的最佳实践十二、MySQL备份与恢复12.1 备份的重要性和策略12.2 常用备份方法介绍12.3 恢复方法和故障排除12.4 备份与恢复的自动化管理十三、MySQL性能监控与调优13.1 性能监控的关键指标13.2 性能分析工具的使用13.3 查询优化的策略和方法13.4 系统配置的优化指南十四、MySQL replication(复制)14.1 复制的工作原理和类型14.2 主从复制的设置和维护14.3 复制延迟和故障处理14.4 复制在高可用性方案中的应用十五、MySQL的高级特性15.1 全文索引和搜索15.2 空间数据类型和地理信息查询15.3 事件调度和定时任务15.4 数据库的性能分析和监控工具重点和难点解析重点:MySQL的历史和发展,特点和优势数据库的基本概念,包括数据库的分类,数据表的结构和设计,数据库的创建和管理SQL语言基础,包括DDL,DML,DQL数据库的增删改查操作索引和约束的使用和管理数据库的高级查询,包括联合查询,子查询,数据汇总和分组,排序和限制存储过程和函数的创建和执行触发器和事件的创建和管理事务的特性和管理数据库的安全性和权限管理备份与恢复策略和方法性能监控与调优的关键指标和工具复制的工作原理和类型,主从复制的设置和维护全文索引和搜索,空间数据类型和地理信息查询事件调度和定时任务,数据库的性能分析和监控工具难点:MySQL的安装和配置细节复杂SQL查询的编写和优化存储过程和函数的高级应用触发器和事件的精确控制和调度事务的并发控制和故障处理高级查询优化和性能调优复制中的延迟和故障处理全文索引和空间数据类型的应用场景事件调度和定时任务的复杂场景设计。
宋红康mysql高级篇笔记MySQL 是一款广泛应用于互联网领域的关系型数据库管理系统。
它的高级功能和优势使得它成为互联网开发者的首选。
本文将分享一些关于 MySQL 高级篇的笔记,涵盖了一些互联网技术介绍、互联网商业和技术应用方面的内容。
一、索引优化索引是提高数据库查询效率的重要手段之一。
在 MySQL 中,使用合适的索引可以显著提升查询性能。
首先,我们需要了解不同类型的索引,如主键索引、唯一索引和普通索引等。
其次,根据具体应用场景,我们可以使用覆盖索引、前缀索引、联合索引等技术进行索引优化。
此外,我们还要注意索引的维护和管理,及时进行索引的重建和优化。
二、查询优化在互联网应用中,查询是最常见的数据库操作之一。
如何编写高效的查询语句,能够快速地获取所需的数据,是每个开发者都应该关注的问题。
本节将介绍一些查询优化的技巧,例如避免使用通配符查询、合理使用 LIMIT 关键字、使用 EXPLAIN 分析查询执行计划等。
三、事务管理事务是保证数据库操作一致性和完整性的重要手段。
MySQL 支持事务的 ACID 特性,可以确保多个操作的原子性、一致性、隔离性和持久性。
本节将详细介绍如何使用事务管理,包括事务的开启、提交和回滚,以及事务并发控制的方法。
四、高级数据操作除了基本的增删改查操作,MySQL 还提供了一些高级数据操作功能,方便开发者完成复杂的数据处理任务。
本节将介绍如何使用子查询、联合查询、分组查询和多表操作等技术,实现更灵活和高效的数据操作。
五、存储引擎选择MySQL 支持多种存储引擎,如 InnoDB、MyISAM、Memory 等。
不同的存储引擎具有不同的特点和适用场景。
本节将比较各种存储引擎的优缺点,并给出存储引擎选择的建议。
六、高可用性和容灾备份在互联网应用中,数据库的高可用性和容灾备份是非常重要的。
本节将介绍如何使用主从复制、读写分离、故障转移和数据备份等技术,提高数据库的稳定性和可用性。
mysql必背50条语句1. 创建数据库:```sqlCREATE DATABASE dbname;```2. 删除数据库:```sqlDROP DATABASE dbname;```3. 选择数据库:```sqlUSE dbname;```4. 显示所有数据库:```sqlSHOW DATABASES;```5. 创建表:```sqlCREATE TABLE tablename (column1 datatype,column2 datatype,...);```6. 查看表结构:```sqlDESC tablename;```7. 删除表:```sqlDROP TABLE tablename;```8. 插入数据:```sqlINSERT INTO tablename (column1, column2, ...) VALUES (value1, value2, ...);```9. 查询数据:```sqlSELECT * FROM tablename;```10. 条件查询:```sqlSELECT * FROM tablename WHERE condition;```11. 更新数据:```sqlUPDATE tablename SET column1 = value1, column2 = value2 WHERE condition;```12. 删除数据:```sqlDELETE FROM tablename WHERE condition;```13. 查找唯一值:```sqlSELECT DISTINCT column FROM tablename;```14. 排序数据:```sqlSELECT * FROM tablename ORDER BY column ASC/DESC;```15. 限制结果集:```sqlSELECT * FROM tablename LIMIT 10;```16. 分页查询:```sqlSELECT * FROM tablename LIMIT 10 OFFSET 20;```17. 计算行数:```sqlSELECT COUNT(*) FROM tablename;```18. 聚合函数:```sqlSELECT AVG(column), SUM(column), MIN(column), MAX(column) FROM tablename;```19. 连接表:```sqlSELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;```20. 创建索引:```sqlCREATE INDEX indexname ON tablename (column);```21. 查看索引:```sqlSHOW INDEX FROM tablename;```22. 删除索引:```sqlDROP INDEX indexname ON tablename;```23. 备份整个数据库:```sqlmysqldump -u username -p dbname > backup.sql;```24. 恢复数据库:```sqlmysql -u username -p dbname < backup.sql;```25. 修改表结构:```sqlALTER TABLE tablename ADD COLUMN newcolumn datatype;```26. 重命名表:```sqlRENAME TABLE oldname TO newname;```27. 增加主键:```sqlALTER TABLE tablename ADD PRIMARY KEY (column);```28. 删除主键:```sqlALTER TABLE tablename DROP PRIMARY KEY;```29. 增加外键:```sqlALTER TABLE tablename ADD CONSTRAINT fk_name FOREIGN KEY (column) REFERENCES othertable(column);```30. 删除外键:```sqlALTER TABLE tablename DROP FOREIGN KEY fk_name;```31. 查看活动进程:```sqlSHOW PROCESSLIST;```32. 杀死进程:```sqlKILL process_id;```33. 给用户授权:```sqlGRANT permission ON dbname.tablename TO 'username'@'host';```34. 撤销用户权限:```sqlREVOKE permission ON dbname.tablename FROM 'username'@'host';```35. 创建用户:```sqlCREATE USER 'username'@'host' IDENTIFIED BY 'password';```36. 删除用户:```sqlDROP USER 'username'@'host';```37. 修改用户密码:```sqlSET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');```38. 查看用户权限:```sqlSHOW GRANTS FOR 'username'@'host';```39. 启用外键约束:```sqlSET foreign_key_checks = 1;```40. 禁用外键约束:```sqlSET foreign_key_checks = 0;```41. 启用查询缓存:```sqlSET query_cache_type = 1;```42. 禁用查询缓存:```sqlSET query_cache_type = 0;```43. 查看服务器版本:```sqlSELECT VERSION();```44. 查看当前日期和时间:```sqlSELECT NOW();```45. 查找匹配模式:```sqlSELECT * FROM tablename WHERE column LIKE 'pattern';```46. 计算平均值:```sqlSELECT AVG(column) FROM tablename;```47. 查找空值:```sqlSELECT * FROM tablename WHERE column IS NULL;```48. 日期比较:```sqlSELECT * FROM tablename WHERE date_column > '2022-01-01';```49. 将结果导出为CSV 文件:```sqlSELECT * INTO OUTFILE 'output.csv' FIELDS TERMINATED BY ',' FROM tablename;```50. 将结果导入其他表:```sqlLOAD DATA INFILE 'input.csv' INTO TABLE tablename FIELDS TERMINATED BY ',';。
Mysql笔记(附Mysql基础书pdf版)资料数据库篇SHOW DATABASES; //显⽰数据库系统中已经存在的数据库CREATE DATABASE 数据库名; //创建数据库DROP DATABASE 数据库名; //删除数据库表篇注:在使⽤操作表语句前,⾸先要使⽤USE语句选择数据库。
选择数据库语句的基本格式为“USE 数据库名”。
否则会报错,1046;CREATE TABLE 表名 ( 属性名数据类型 [完整性约束条件],属性名数据类型 [完整性约束条件],属性名数据类型);表名不能为SQL语句的关键字,⼀个表可以有多个属性。
定义时,字母⼤⼩写均可,各属性之间⽤逗号隔开,最后⼀个属性不需要加逗号。
主键主键有唯⼀值单字段主键属性名数据类型 primary key //创建主键,写在属性名数据类型后⾯;多字段主键primary key(属性名 1,属性名2,属性名n)两者的组合可以确定唯⼀的⼀条记录;外键外键不⼀定必须为⽗表的主键,但必须是唯⼀性索引,主键约束和唯⼀性约束都是唯⼀性索引;外键可以为空值;设置外键的基本语法规则如下:CONSTRAINT 外键别名 FOREIGN KEY(属性 1.1,属性1.2,属性1.n)REFERENCES 表名(属性2.1,属性2.2,属性2.n)其中,“外键别名”参数是为外键的代号;“属性1”参数列表是⼦表中设置的外键;“表名”参数是指⽗表的名称;“属性2”参数列表是⽗表的主键。
设置表的⾮空约束设置表的唯⼀性约束设置表的属性值⾃动增加查看表结构DESCRIBE 表名; // 查看表基本结构语句,可缩写为desc 表名SHOW CREATE TABLE 表名; //查看表详细结构语句(包含存储引擎、字符编码)删除表DROP TABLE 表名;//删除没有被关联的普通表删除⽗表需要先将外键删除,然后才能去删除⽗表。
字段篇//通过ALTER TABLE语句ALTER TABLE 旧表名 RENAME [TO] 新表名;//修改表名 TO参数是可选参数,是否在语句中出现不会影响语句的执⾏。
mysql简答题精简版1、请简述什么是数据库管理系统,什么是数据库系统?以及它们的主要功能有哪些?2、请简述什么是模式、外模式和内模式?3、请简述c/s结构与b/s结构的区别。
4、简述事务的属性。
5、请说明存储过程、存储函数、触发器的异同。
6、mysql中的表维护语句有哪些?7、什么就是数据模型?数据库管理系统所使用的主要数据模型存有哪些?模型化后和数据之间的工具。
层次模型、网状模型、关系模型。
8、详述索引的概念和促进作用,以及索引的分类。
①快速读取数据②保证数据记录的唯一性③实现表与表之间的参照完整性④在使用groupbyordreby检索时,利用索引可以减少排序和分组时间9、试述数据完整性的含义和分类。
含义:存储在数据库中的数据的准确性和一致性。
分类:实体完整性、参考完整性、用户自定义完整性10、当多用户对数据库并发访问时,锁定所起到的作用有哪些?避免用户加载正在由其他用户修改的数据吗,并且可以避免多个用户同时修改相同的数据,保证事务完整性和数据库一致性。
11、详述mysql提供更多的隔绝级别。
序列化、可重复读、提交读、未提交读12、简述关系型数据库的设计步骤。
概念结构设计、逻辑结构设计、数据库物理设计13、详述索引的弊端。
①索引时以文件的形式存储的,索引文件要占磁盘空间。
假若存在大量的索引,索引文件可能回避数据文件更快的达到最大文件的尺寸。
②在更新表索引列于上的数据时,对索引也须要更新的,这可能将须要再次非政府一个索引,假若表的索引很多,那就是浪费时间的。
也就是说,减少了嵌入、删掉、修正和其他载入操作方式的效率。
表索引越多,更新表的时间越短14、详述mysql为确保数据安全所提供更多的方法。
①添加和删除用户②授予和收回权限③权限的转移和限制④利用界面方式操作用户与权限。
15、恳请表明存储过程、存储函数、触发器的优劣。
触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:update、insert或delete。
数据库快速入门之MySQL篇MySQL是一种开源的关系型数据库管理系统,在当前的互联网技术中被广泛使用。
MySQL以其高速、可靠、易于使用和扩展等特点,成为了一个备受好评的数据库选择。
本文将简单介绍MySQL的基本知识和操作。
一、MySQL的基础知识1.数据库的概念数据库是一个数据的集合,是经过组织和存储的集合。
在计算机领域中,常常用于管理和存储各种类型的数据,如文本、音频、视频等。
数据库具有数据存储、数据管理、数据统计分析等多种功能。
2.数据库管理系统的概念数据库管理系统(DBMS)是指管理数据的软件系统,它可以对数据进行操作、处理、存储和保护。
它是建立在数据库上的一个软件系统。
3.关系型数据库管理系统的概念关系型数据库管理系统(RDBMS)是一种使用关系型模型来管理数据库的管理系统。
在这种模型中,数据被存储在表格中,并且使用关键字来连接表格数据。
MySQL是一种典型的RDBMS。
二、MySQL的操作1.安装MySQLMySQL的安装相对比较简单,只需要下载MySQL的安装包,然后按照提示进行安装即可。
但需要注意的是,安装MySQL要检查操作系统是否支持,以及安装路径是否存在。
2.启动和关闭MySQL安装完成后,需要启动MySQL以进行一些操作。
可以通过在命令行中输入以下指令来启动MySQL:mysql -u root -ppassowrd: ********```其中,“-u”参数指定用户名,“-p”参数指定密码,“passowrd:********”是指输入密码,注意密码不会在终端上显示。
如果没有密码,则不需要输入密码。
关闭MySQL可以通过输入以下语句结束:```mysql> exit;```3.创建数据库在MySQL中创建数据库可以使用以下指令:mysql> create database dbname;```其中,“dbname”是指数据库名称。
如果需要使用创建的数据库,可以通过以下指令切换:```mysql> use dbname;```4.创建表格在MySQL中创建表格可以使用以下指令:```mysql> create table tablename ( field1 type1, field2 type2……); ```其中,“tablename”是指创建的表名,而“field1”和“type1”等则是表示创建的字段名称和类型。
Mysql 自学笔记前言综述:磁盘搜索。
需要花时间从磁盘上找到一个数据,用在现代磁盘的平均时间通常小于10ms,因此理论上我们能够每秒大约搜索1000次。
这个时间在新磁盘上提高不大并且很难为一个表进行优化。
优化它的方法是将数据分布在多个磁盘上。
磁盘读/写。
当磁盘放入正确位置后,我们需要从中读取数据。
对于现代的磁盘,一个磁盘至少传输10-20Mb/s的吞吐。
这比搜索要容易优化,因为你能从多个磁盘并行地读。
CPU周期。
我们将数据读入内存后,需要对它进行处理以获得我们需要的结果。
表相对于内存较小是最常见的限制因素。
但是对于小表,速度通常不成问题。
·内存带宽。
当CPU需要的数据超出CPU缓存时,主缓存带宽就成为内存的一个瓶颈。
这在大多数系统正是一个不常见的瓶颈但是你应该知道它。
一. MySQL设计局限与折衷1. 如果向列内插入不合适的或超出范围的值,MySQL将该列设定为“最好的可能的值”,而不是报告错误。
对于数字值,为0、可能的最小值或最大值。
对于字符串,为空字符串或列内可以保存的字符串。
请注意当运行在严格模式或TRADITIONAL SQL模式时该行为不适用。
当然这仅仅是在严格的模式下,包括TRADITIONAL SQL 模式,必须为not null 指定默认值。
二。
可移植性如果你使用某个数据库特定的功能(例如MySQL专用的REPLACE语句),应该为SQL 服务器编码一个方法以实现同样的功能。
尽管慢些,但确允许其它服务器执行同样的任务。
用MySQL,可以使用/*! */语法把MySQL特定的关键词加到查询中。
在/**/中的代码将被其它大多数SQL服务器视为注释(并被忽略)。
三。
优化SELECT 查询1.影响所有语句的一个因素是:你的许可设置得越复杂,所需要的开销越多。
执行GRANT语句时使用简单的许可,当客户执行语句时,可以使MySQL降低许可检查开销。
例如,如果未授予任何表级或列级权限,服务器不需要检查tables_priv和columns_priv表的内容。
同样地,如果不对任何账户进行限制,服务器不需要对资源进行统计。
如果查询量很高,可以花一些时间使用简化的授权结构来降低许可检查开销。
2.如果你的问题是与具体MySQL表达式或函数有关,可以使用mysql客户程序所带的BENCHMARK()函数执行定时测试。
其语法为BENCHMARK(loop_count,expression)。
例如:mysql> SELECT BENCHMARK(1000000,1+1);+------------------------+| BENCHMARK(1000000,1+1) |+------------------------+| 0 |+------------------------+1 row in set (0.32 sec)3.为了看清一张表有什么索引,使用SHOW INDEX FROM tbl_name。
keykey列显示MySQL实际决定使用的键(索引)。
如果没有选择索引,键是NULL。
要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
4.Analyze TableMYISAM 引擎下用myisamchk --analyzeMySQL 的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应的列包含多少个不同的值——如果cardinality大大少于数据的实际散列程度,那么索引就基本失效了。
我们可以使用SHOW INDEX语句来查看索引的散列程度:SHOW INDEX FROM PLAYERS;TABLE KEY_NAME COLUMN_NAME CARDINALITY------- -------- ----------- -----------PLAYERS PRIMARY PLAYERNO 14因为此时PLAYER表中不同的PLAYERNO数量远远多于14,索引基本失效。
下面我们通过Analyze Table语句来修复索引:ANAL YZE TABLE PLAYERS;SHOW INDEX FROM PLAYERS;结果是:TABLE KEY_NAME COLUMN_NAME CARDINALITY------- -------- ----------- -----------PLAYERS PRIMARY PLAYERNO 1000此时索引已经修复,查询效率大大提高。
需要注意的是,如果开启了binlog,那么Analyze Table的结果也会写入binlog,我们可以在analyze和table之间添加关键字local取消写入。
5.Optimize Table经常更新数据的磁盘需要整理碎片,数据库也是这样,Optimize Table语句对MyISAM 和InnoDB类型的表都有效。
如果表经常更新,就应当定期运行Optimize Table语句,保证效率。
与Analyze Table一样,Optimize Table也可以使用local来取消写入binlog。
6.总的来说,要想使一个较慢速SELECT ... WHERE更快,应首先检查是否能增加一个索引。
不同表之间的引用通常通过索引来完成。
你可以使用EXPLAIN语句来确定SELECT语句使用哪些索引。
7.WHERE 语句的优化去除不必要的括号:·((a AND b) AND c OR (((a AND b) AND (c AND d))))·-> (a AND b AND c) OR (a AND b AND c AND d)·常量重叠:·(a<b AND b=c) AND a=5·-> b>5 AND b=c AND a=5·去除常量条件(由于常量重叠需要):·(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)·-> B=5 OR B=6·索引使用的常数表达式仅计算一次。
另外where val = …5‟要比where val = 5,(如果5是整数的话)慢几十倍。
尝试所有可能性便可以找到表联接的最好联接组合。
如果所有在ORDER BY和GROUP BY的列来自同一个表,那么当联接时,该表首先被选中。
如果有一个ORDER BY子句和不同的GROUP BY子句,或如果ORDER BY或GROUP BY包含联接队列中的第一个表之外的其它表的列,则创建一个临时表。
如果使用SQL_SMALL_RESULT,MySQL使用内存中的一个临时表。
每个表的索引被查询,并且使用最好的索引,除非优化器认为使用表扫描更有效。
是否使用扫描取决于是否最好的索引跨越超过30%的表。
优化器更加复杂,其估计基于其它因素,例如表大小、行数和I/O块大小,因此固定比例不再决定选择使用索引还是扫描。
在一些情况下,MySQL能从索引中读出行,甚至不查询数据文件。
如果索引使用的所有列是数值类,那么只使用索引树来进行查询。
输出每个记录前,跳过不匹配HA VING子句的行。
例子:SELECT ... FROM tbl_nameORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT 10;仅仅使用索引树就可以完成的查询因此快SELECT COUNT(*) FROM tbl_name WHERE key_part1=val1 AND key_part2=val2;下列查询使用索引按排序顺序检索行,不用另外的排序:SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... ;8.group by 的优化查询在大多数情况下,DISTINCT子句可以视为GROUP BY的特殊情况。
例如,下面的两个查询是等效的:SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 > const;SELECT c1, c2, c3 FROM t1 WHERE c1 > const GROUP BY c1, c2, c3;如果不使用查询中命名的所有表的列,MySQL发现第1个匹配后立即停止扫描未使用的表。
在下面的情况中,假定t1在t2之前使用(可以用EXPLAIN检查),发现t2中的第1行后,MySQL不再(为t1中的任何行)读t2:SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;9.避免全表扫描使用ANAL YZE TABLE tbl_name为扫描的表更新关键字分布。
·对扫描的表使用FORCE INDEX告知MySQL,相对于使用给定的索引表扫描将非常耗时用--max-seeks-for-key=1000选项启动mysqld或使用SET max_seeks_for_key=1000告知优化器假设关键字扫描不会超过1,000次关键字搜索。
10.如果同时从同一个客户端插入很多行,使用含多个V ALUE的INSERT语句同时插入几行。
这比使用单行INSERT语句快(在某些情况下快几倍)。
如果你正向一个非空表添加数据,可以调节bulk_insert_buffer_size变量,使数据插入更快。
·如果你从不同的客户端插入很多行,能通过INSERT DELAYED语句加快速度。
·用MyISAM,如果在表中没有删除的行,能在SELECT语句正在运行的同时插入行。
·当从一个文本文件装载一个表时,使用LOAD DATA INFILE。
这通常比使用很多INSERT语句快20倍。
参见13.2.5节,“LOAD DATA INFILE语法”。
有选择地用CREATE TABLE创建表。
执行FLUSH TABLES语句或命令mysqladmin flush-tables。
使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name。
这将从表中取消所有索引的使用。
用LOAD DA TA INFILE把数据插入到表中,因为不更新任何索引,因此很快。
如果只想在以后读取表,使用myisampack压缩它。
参见15.1.3.3节,“压缩表特性”。
用myisamchk -r -q /path/to/db/tbl_name重新创建索引。