#26 MySQL 相关的命令汇总
MySQL DB 2021-01-06通过 apt 和 apt-file 列出 mysql 提供的所有可执行文件。
coding in a complicated world
通过 apt 和 apt-file 列出 mysql 提供的所有可执行文件。
说明:
DEFAULT current_timestamp() ON UPDATE current_timestamp()YEAR(2) 被抛弃,新建时会自动转换成 YEAR(4)分区表的增强
最大可用分区数增加至 8192
操作时显式指定分区,比如:
SELECT * FROM employees PARTITION (p0, p2)
Undo Log 可保存在独立表空间中,因其是随机 IO,更适合放到 SSD 中。但仍然不支持空间的自动回收。
innodb_log_file_size)。mysql.user 的 password_expired))复制和日志(replication)
1)支持延时复制,MySQL现在支持延迟复制,默认是0秒。使用CHANGE MASTER TO参数 MASTER_DELAY 来设置延迟。可以让slave跟master之间控制一个时间间隔,方便特殊情况下的数据恢复。(以前是使用第三方工具可以做到) 2)行级复制功能加强,可以降低磁盘、内存、网络等资源开销(只记录能确定行记录的字段即可)。3)现在支持多线程复制。如果开启,sql线程作为协调者协调多个工作线程,数量取决于slave_parallel_workers。现在多线程复制以单库为基础,特定库的更新的相对顺序和主库一样。不过,没有必要协调不同库之间的事务。事务可以被分布到每个库,意味着一个复制从库的工作线程可以顺序执行事务而不必等待其它库的更新完成。4)支持以全局统一事务ID(GTID)为基础的复制。当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务。GTID复制是全部以事务为基础,使得检查主从一致性变得非常简单。如果所有主库上提交的事务也同样提交到从库上,一致性就得到了保证。5)支持启用GTID,对运维人员来说应该是一件令人高兴的事情,在配置主从复制,传统的方式里,你需要找到binlog和POS点,然后change master to指向,而不是很有经验的运维,往往会将其找错,造成主从同步复制报错,在mysql5.6里,如果使用了GTIDs,启动一个新的复制从库或切换到一个新的主库,就不必依赖log文件或者pos位。需要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制GTID自动找点同步。
6)binlog的读写现在是崩溃安全的,因为只有完整的事件(或者事务)才会被记录和读取。默认会记录事件的大小以及事件本身,使用大小来验证事件被正确记录。你也可以使用参数binlog_checksum设置使用crc32记录事件的校验值。使用参数master_verify_checksum可以让服务读取校验值。slave-sql-verify-checksum参数使从库读relay日志的时候读取校验值。
MySQL支持在表中保存主库连接信息了。使用参数–master-info-repository和 –relay-log-info-repository来设置。设置 –master-info-repository为表,会记录连接信息到slave_master_info表。设置–relay-log-info-repository为表,会记录relay log信息到slave_relay_log_info表。这几个表都是自动建立在mysql系统库。
增强Performance Schema数据库(Mysql performance schema)
1)记录表的输入与输出,操作包括行级访问表和临时表,如insert,upate,delete. 2)表的事件过滤,以库或者表名为基础。3)线程的事件过滤,更多关于线程的信息被搜集4)表和索引I/O以及表锁的统计表。5)记录命令以及命令的阶段。
不允许在存储过程中或者函数参数中或者存储程序本地变量中使用default来指定(如:SET var_name = DEFAULT命令),但可以在指定系统变量时使用default。
组复制
InnoDB Cluster
多源复制
增强半同步(AFTER_SYNC)
基于WRITESET的并行复制。
在线开启GTID复制。
在线设置复制过滤规则。
在线修改Buffer pool的大小。
在同一长度编码字节内,修改VARCHAR的大小只需修改表的元数据,无需创建临时表。
可设置NUMA架构的内存分配策略(innodb_numa_interleave)。
透明页压缩(Transparent Page Compression)。
UNDO表空间的自动回收。
查询优化器的重构和增强。
可查看当前正在执行的SQL的执行计划(EXPLAIN FOR CONNECTION)。
引入了查询改写插件(Query Rewrite Plugin),可在服务端对查询进行改写。
EXPLAIN FORMAT=JSON会显示成本信息,这样可直观的比较两种执行计划的优劣。
引入了虚拟列,类似于Oracle中的函数索引。
新实例不再默认创建test数据库及匿名用户。
引入ALTER USER命令,可用来修改用户密码,密码的过期策略,及锁定用户等。
mysql.user表中存储密码的字段从password修改为authentication_string。
表空间加密。
优化了Performance Schema,其内存使用减少。
Performance Schema引入了众多instrumentation。常用的有Memory usage instrumentation,可用来查看MySQL的内存使用情况,Metadata Locking Instrumentation,可用来查看MDL的持有情况,Stage Progress instrumentation,可用来查看Online DDL的进度。
同一触发事件(INSERT,DELETE,UPDATE),同一触发时间(BEFORE,AFTER),允许创建多个触发器。在此之前,只允许创建一个触发器。
InnoDB原生支持分区表,在此之前,是通过ha_partition接口来实现的。
分区表支持可传输表空间特性。
集成了SYS数据库,简化了MySQL的管理及异常问题的定位。
原生支持JSON类型,并引入了众多JSON函数。
引入了新的逻辑备份工具-mysqlpump,支持表级别的多线程备份。
引入了新的客户端工具-mysqlsh,其支持三种语言:JavaScript, Python and SQL。两种API:X DevAPI,AdminAPI,其中,前者可将MySQL作为文档型数据库进行操作,后者用于管理InnoDB Cluster。
mysql_install_db被mysqld --initialize代替,用来进行实例的初始化。
原生支持systemd。
引入了super_read_only选项。
可设置SELECT操作的超时时长(max_execution_time)。
可通过SHUTDOWN命令关闭MySQL实例。
引入了innodb_deadlock_detect选项,在高并发场景下,可使用该选项来关闭死锁检测。
引入了Optimizer Hints,可在语句级别控制优化器的行为,如是否开启ICP,MRR等,在此之前,只有Index Hints。
GIS的增强,包括使用Boost.Geometry替代之前的GIS算法,InnoDB开始支持空间索引。
最重要的是窗口函数和 CTE
其他MySQL 8.0计划更新的特性包括:
在锁定行方面增加了更多选项,如SKIP LOCKED和NOWAIT两个选项。其中,
SKIP LOCKED允许在操作中不锁定那些需要忽略的行;NOWAIT则在遇到行的锁定的时候马上抛出错误。
MySQL能根据可用内存的总量去伸缩扩展,以更好利用虚拟机的部署。
新增“隐藏索引”的特性,这样索引可以在查询优化器中变为不可见。索引在标记为不可用后,和表的数据更改同步,但是优化器不会使用它们。对于使用隐藏索引的建议,是当不决定某个索引是否需要保留的时候,可以使用。
引入了原生的,基于InnoDB的数据字典。数据字典表位于mysql库中,对用户不可见,同mysql库的其它系统表一样,保存在数据目录下的mysql.ibd文件中。不再置于mysql目录下。
Atomic DDL。
重构了INFORMATION_SCHEMA,其中,部分表已重构为基于数据字典的视图,在此之前,其为临时表。
PERFORMANCE_SCHEMA查询性能提升,其已内置多个索引。
不可见索引(Invisible index)。
降序索引。
直方图。
角色(Role)。
资源组(Resource Groups),可用来控制线程的优先级及其能使用的资源,目前,能被管理的资源只有CPU。
引入了innodb_dedicated_server选项,可基于服务器的内存来动态设置innodb_buffer_pool_size,innodb_log_file_size和innodb_flush_method。
快速加列(ALGORITHM=INSTANT)。
自增主键的持久化。
可持久化全局变量(SET PERSIST)。
默认字符集由latin1修改为utf8mb4。
默认开启UNDO表空间,且支持在线调整数量(innodb_undo_tablespaces)。在MySQL 5.7中,默认不开启,若要开启,只能初始化时设置。
备份锁。
Redo Log的优化,包括允许多个用户线程并发写入log buffer,可动态修改innodb_log_buffer_size的大小。
默认的认证插件由mysql_native_password更改为caching_sha2_password。
默认的内存临时表由MEMORY引擎更改为TempTable引擎,相比于前者,后者支持以变长方式存储VARCHAR,VARBINARY等变长字段。从MySQL 8.0.13开始,TempTable引擎支持BLOB字段。
Grant不再隐式创建用户。
SELECT ... FOR SHARE和SELECT ... FOR UPDATE语句中引入NOWAIT和SKIP LOCKED选项,解决电商场景热点行问题。
正则表达式的增强,新增了4个相关函数,REGEXP_INSTR(),REGEXP_LIKE(),REGEXP_REPLACE(),REGEXP_SUBSTR()。
查询优化器在制定执行计划时,会考虑数据是否在Buffer Pool中。而在此之前,是假设数据都在磁盘中。
ha_partition接口从代码层移除,如果要使用分区表,只能使用InnoDB存储引擎。
引入了更多细粒度的权限来替代SUPER权限,现在授予SUPER权限会提示warning。
GROUP BY语句不再隐式排序。
MySQL 5.7引入的表空间加密特性可对Redo Log和Undo Log进行加密。
information_schema中的innodb_locks和innodb_lock_waits表被移除,取而代之的是performance_schema中的data_locks和data_lock_waits表。
引入performance_schema.variables_info表,记录了参数的来源及修改情况。
增加了对于客户端报错信息的统计(performance_schema.events_errors_summary_xxx)。
可统计查询的响应时间分布(call sys.ps_statement_avg_latency_histogram())。
支持直接修改列名(ALTER TABLE ... RENAME COLUMN old_name TO new_name)。
用户密码可设置重试策略(Reuse Policy)。
移除PASSWORD()函数。这就意味着无法通过“SET PASSWORD ... = PASSWORD('auth_string') ”命令修改用户密码。
代码层移除Query Cache模块,故Query Cache相关的变量和操作均不再支持。
BLOB, TEXT, GEOMETRY和JSON字段允许设置默认值。
可通过RESTART命令重启MySQL实例。
SHOW VARIABLES LIKE '%engine%';
SHOW ENGINES;
以 MySQL 8.0 为例:
除了 PERFORMANCE_SCHEMA,
| Engine | Support | Comment | Transactions | XA | Savepoints |
|---|---|---|---|---|---|
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
Percona (8.0) 和 MySQL 保持一致,不过 InnoDB 实际被替换成他们自己开发的兼容引擎 XtraDB。
MariaDB (10.1.45) 也使用 XtraDB 替换了 InnoDB,而且没有 BLACKHOKE, ARCHIVE,但是多了:
| Engine | Support | Comment | Transactions | XA | Savepoints |
|---|---|---|---|---|---|
| TokuDB | DEFAULT | Percona TokuDB Storage Engine with Fractal Tree(tm) Technology | YES | YES | YES |
| SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES |
| Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO |
在 2010 年发布的 MySQL 5.5.5 之前,一直是 MySQL 的默认引擎。
InnoDB 是甲骨文的。
TokuTek 公司开发,后来被 Percona 公司收购,现在已被 Percona 废弃(仓库归档)。
| 字段 | MySQL 数据类型 | 备注 |
|---|---|---|
| 用户 ID | INT UNSIGNED | - |
| 用户名称 | VARCHAR(255) | 按需调整长度 |
| 年龄 | TINYINT UNSIGNED | 0 - 255 |
| 性别 | ENUM('男', '女') | 若性别选项较多,可改用 VARCHAR 😂 |
| 国家地区 | VARCHAR(100) | 或使用 ISO 3166 国家代码(CHAR(4)) |
| 电话号码 | VARCHAR(20) | 可包含符号(如 +、-)和空格(考虑加密存储) |
| URL | VARCHAR(2083) | - |
| Email 地址 | VARCHAR(255) | 配合正则验证(考虑加密存储) |
| IP 地址 | VARBINARY(16) | INET_ATON / INET_NTOA / INET6_ATON / INET6_NTOA |
| APIKey | VARCHAR(255) | 加密 / 哈希后的密钥 |
| 雪花 ID | BIGINT UNSIGNED | - |
| 日期 | DATE | 日期 |
| 时间 | TIME | 时间(不含日期) |
| 日期时间 | DATETIME | 如需考虑时区,统一转换成 UTC / 北京时间存储 |
| 时间戳 | TIMESTAMP | 无时区问题,且存储空间小(如果可以忽略 2038 问题) |
| 年 | YEAR | 1 字节,1901 - 2155 |
| 状态 | TINYINT | - |
| 数据类型 | 优点 | 缺点 | 备注 |
|---|---|---|---|
| ENUM | 可读性 + 存储高效 | 拓展性差(增加类型需要改表) | 适合修改频率极低 |
| TINYINT | 存储高效 | 可读性差 | - |
| VARCHAR | 可读性 | 存储效率低 | - |
| 数据类型 | 存储空间(IPv4) | 存储空间(IPv6) | 可读性 | 查询效率 |
|---|---|---|---|---|
| char / varchar | 15 | 39 | 高 | 低 |
| unsigned int | 4 | 不支持 | 低 | 高 |
| binary / varbinary | 4 | 16 | 低 | 高 |
常见操作:排序,按网段查询
DATE(3 字节),仅需年份时用YEAR(1 字节)。DATETIME/TIMESTAMP);DATETIME(3)/BIGINT)。| 数据类型 | 大小 | 精度 | 时间范围 | 描述 |
|---|---|---|---|---|
| DATETIME | 8 字节 | 秒级 | 1000 - 9999 | - |
| DATETIME(n) | 8+2n 字节 | 微秒级 | 1000 - 9999 | n 表示小数位(0 ~ 6),毫秒:n = 3 |
| TIMESTAMP | 4 字节 | 秒级 | 1970 - 2038 | 按 UTC 时间存储,查询时自动转换时区,存在 2038 问题 |
| TIMESTAMP(n) | 4+2n 字节 | 微秒级 | 1970 - 2038 | 支持毫秒/,存在 2038 问题 |
| UNSIGNED INT | 4 字节 | 秒级 | 1970 - 2038 | 和 timestamp 一致,存在 2038 问题 |
| UNSIGNED BIGINT | 8 字节 | 毫秒级 | ♾️ | 无溢出风险 |
| CHAR(19) | 19 字节 | 任意 | ♾️ | YYYY-MM-DD HH:MM:SS,可读但低效 |
| VARCHAR(25) | 25 字节 | 任意 | ♾️ | 2025-06-17T15:30:00+08:00,可读但低效 |
MySQL 语句:
角色 (用户模板)
create role stuff@localhost;
... 分配权限,修改属性
select host, user as role from mysql.user where authentication_string = '';
CREATE ROLE [IF NOT EXISTS] role [, role ] ...DROP ROLESET ROLESET DEFAULT ROLE用户
select host, user, plugin, left(authentication_string, 5) as pass, account_locked from mysql.user;
select distinct user from mysql.user;
select current_user(), current_role();
CREATE USERDROP USERALTER USERRENAME USER密码
SET PASSWORD权限
GRANTREVOKECREATE RESOURCE GROUPDROP RESOURCE GROUPALTER RESOURCE GROUPSET RESOURCE GROUPANALYZE TABLECHECK TABLECHECKSUM TABLEOPTIMIZE TABLEREPAIR TABLECREATE FUNCTIONDROP FUNCTION
INSTALL COMPONENT
UNINSTALL COMPONENT
INSTALL PLUGIN
UNINSTALL PLUGINSET 设置变量SET CHARACTER SETSET NAMESSHOW BINARY LOGS binlogSHOW BINLOG EVENTS binlogSHOW CHARACTER SET 字符集SHOW COLLATION 排序规则SHOW COLUMNS 查看表结构SHOW [EXTENDED] [FULL] {COLUMNS | FIELDS}
{FROM | IN} tbl_name
[{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
SHOW CREATE DATABASESHOW CREATE EVENTSHOW CREATE FUNCTIONSHOW CREATE PROCEDURESHOW CREATE TABLESHOW CREATE TRIGGERSHOW CREATE USERSHOW CREATE VIEW
SHOW DATABASES 数据库
SHOW ENGINE 查看指定引擎的状态部分引擎会提供一些状态信息,比如 INNODB, PERFORMANCE_SCHEMA
SHOW ENGINES 存储引擎SHOW ERRORSSHOW EVENTSSHOW FUNCTION CODESHOW FUNCTION STATUSSHOW GRANTS 用户权限SHOW INDEX 查看指定表的索引SHOW MASTER STATUSSHOW OPEN TABLESSHOW PLUGINS 插件SHOW PRIVILEGESSHOW PROCEDURE CODESHOW PROCEDURE STATUSSHOW PROCESSLISTSHOW PROFILESHOW PROFILESSHOW RELAYLOG EVENTSSHOW REPLICASSHOW SLAVE HOSTS | SHOW REPLICASSHOW REPLICA STATUSSHOW SLAVE | REPLICA STATUSSHOW STATUSSHOW TABLE STATUSSHOW TABLES 表SHOW TRIGGERSSHOW VARIABLESSHOW WARNINGSBINLOGCACHE INDEXFLUSHKILLLOAD INDEX INTO CACHERESETRESET PERSISTRESTARTSHUTDOWN输入 help 之后,按照提示就会发现 MySQL 有一个主题树。
从头 help contents 开始:
Account ManagementALTER RESOURCE GROUPALTER USERCREATE RESOURCE GROUPCREATE ROLECREATE USERDROP RESOURCE GROUPDROP ROLEDROP USERGRANTRENAME USERREVOKESET DEFAULT ROLESET PASSWORDSET RESOURCE GROUPSET ROLEAdministrationBINLOGCACHE INDEXFLUSHHELP COMMANDKILLLOAD INDEXRESETRESET PERSISTRESTARTSETSET CHARACTER SETSET CHARSETSET NAMESSHOWSHOW BINARY LOGSSHOW BINLOG EVENTSSHOW CHARACTER SETSHOW COLLATIONSHOW COLUMNSSHOW CREATE DATABASESHOW CREATE EVENTSHOW CREATE FUNCTIONSHOW CREATE PROCEDURESHOW CREATE SCHEMASHOW CREATE TABLESHOW CREATE TRIGGERSHOW CREATE USERSHOW CREATE VIEWSHOW DATABASESSHOW ENGINESHOW ENGINESSHOW ERRORSSHOW EVENTSSHOW FIELDSSHOW FUNCTION CODESHOW FUNCTION STATUSSHOW GRANTSSHOW INDEXSHOW MASTER LOGSSHOW MASTER STATUSSHOW OPEN TABLESSHOW PLUGINSSHOW PRIVILEGESSHOW PROCEDURE CODESHOW PROCEDURE STATUSSHOW PROCESSLISTSHOW PROFILESHOW PROFILESSHOW RELAYLOG EVENTSSHOW REPLICA STATUSSHOW REPLICASSHOW SCHEMASSHOW SLAVE HOSTSSHOW SLAVE STATUSSHOW STATUSSHOW TABLE STATUSSHOW TABLESSHOW TRIGGERSSHOW VARIABLESSHOW WARNINGSSHUTDOWNComponentsCLONEINSTALL COMPONENTUNINSTALL COMPONENTUNINSTALL PLUGINCompound StatementsBEGIN ENDCASE STATEMENTCLOSEDECLARE CONDITIONDECLARE CURSORDECLARE HANDLERDECLARE VARIABLEFETCHGET DIAGNOSTICSIF STATEMENTITERATELABELSLEAVELOOPOPENREPEAT LOOPRESIGNALRETURNSIGNALWHILEContentsData DefinitionALTER DATABASEALTER EVENTALTER FUNCTIONALTER INSTANCEALTER LOGFILE GROUPALTER PROCEDUREALTER SCHEMAALTER SERVERALTER TABLEALTER TABLESPACEALTER VIEWCREATE DATABASECREATE EVENTCREATE FUNCTIONCREATE INDEXCREATE LOGFILE GROUPCREATE PROCEDURECREATE SCHEMACREATE SERVERCREATE SPATIAL REFERENCE SYSTEMCREATE TABLECREATE TABLESPACECREATE TRIGGERCREATE VIEWDROP DATABASEDROP EVENTDROP FUNCTIONDROP INDEXDROP PROCEDUREDROP SCHEMADROP SERVERDROP SPATIAL REFERENCE SYSTEMDROP TABLEDROP TABLESPACEDROP TRIGGERDROP VIEWFOREIGN KEYRENAME TABLETRUNCATE TABLEData ManipulationCALLDELETEDODUALHANDLERIMPORT TABLEINSERTINSERT DELAYEDINSERT SELECTJOINLOAD DATALOAD XMLPARENTHESIZED QUERY EXPRESSIONSREPLACESELECTTABLEUNIONUPDATEVALUES STATEMENTData TypesAUTO_INCREMENTBIGINTBINARYBITBLOBBLOB DATA TYPEBOOLEANCHARCHAR BYTEDATEDATETIMEDECDECIMALDOUBLEDOUBLE PRECISIONENUMFLOATINTINTEGERLONGBLOBLONGTEXTMEDIUMBLOBMEDIUMINTMEDIUMTEXTSET DATA TYPESMALLINTTEXTTIMETIMESTAMPTINYBLOBTINYINTTINYTEXTVARBINARYVARCHARYEAR DATA TYPEFunctionsAggregate Functions and ModifiersAVGBIT_ANDBIT_ORBIT_XORCOUNTCOUNT DISTINCTGROUP_CONCATJSON_ARRAYAGGJSON_OBJECTAGGMAXMINSTDSTDDEVSTDDEV_POPSTDDEV_SAMPSUMVARIANCEVAR_POPVAR_SAMPBit Functions&<<>>BIT_COUNT^|~Cast Functions and OperatorsBINARY OPERATORCASTCONVERTComparison Operators!=<<=<=>=>>=BETWEEN ANDCOALESCEGREATESTININTERVALISIS NOTIS NOT NULLIS NULLISNULLLEASTNOT BETWEENNOT INDate and Time FunctionsADDDATEADDTIMECONVERT_TZCURDATECURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPCURTIMEDATE FUNCTIONDATEDIFFDATE_ADDDATE_FORMATDATE_SUBDAYDAYNAMEDAYOFMONTHDAYOFWEEKDAYOFYEAREXTRACTFROM_DAYSFROM_UNIXTIMEGET_FORMATHOURLAST_DAYLOCALTIMELOCALTIMESTAMPMAKEDATEMAKETIMEMICROSECONDMINUTEMONTHMONTHNAMENOWPERIOD_ADDPERIOD_DIFFQUARTERSECONDSEC_TO_TIMESTR_TO_DATESUBDATESUBTIMESYSDATETIME FUNCTIONTIMEDIFFTIMESTAMP FUNCTIONTIMESTAMPADDTIMESTAMPDIFFTIME_FORMATTIME_TO_SECTO_DAYSTO_SECONDSUNIX_TIMESTAMPUTC_DATEUTC_TIMEUTC_TIMESTAMPWEEKWEEKDAYWEEKOFYEARYEARYEARWEEKEncryption FunctionsAES_DECRYPTAES_ENCRYPTCOMPRESSMD5RANDOM_BYTESSHA1SHA2STATEMENT_DIGESTSTATEMENT_DIGEST_TEXTUNCOMPRESSUNCOMPRESSED_LENGTHVALIDATE_PASSWORD_STRENGTHEnterprise Encryption FunctionsASYMMETRIC_DECRYPTASYMMETRIC_DERIVEASYMMETRIC_ENCRYPTASYMMETRIC_SIGNASYMMETRIC_VERIFYCREATE_ASYMMETRIC_PRIV_KEYCREATE_ASYMMETRIC_PUB_KEYCREATE_DH_PARAMETERSCREATE_DIGESTFlow Control FunctionsCASE OPERATORIF FUNCTIONIFNULLNULLIFGROUP BY Functions and ModifiersGTIDGTID_SUBSETGTID_SUBTRACTWAIT_FOR_EXECUTED_GTID_SETWAIT_UNTIL_SQL_THREAD_AFTER_GTIDSInformation FunctionsBENCHMARKCHARSETCOERCIBILITYCOLLATIONCONNECTION_IDCURRENT_ROLECURRENT_USERDATABASEFOUND_ROWSICU_VERSIONLAST_INSERT_IDROLES_GRAPHMLROW_COUNTSCHEMASESSION_USERSYSTEM_USERUSERVERSIONInternal FunctionsCAN_ACCESS_COLUMNCAN_ACCESS_DATABASECAN_ACCESS_TABLECAN_ACCESS_USERCAN_ACCESS_VIEWGET_DD_COLUMN_PRIVILEGESGET_DD_CREATE_OPTIONSGET_DD_INDEX_SUB_PART_LENGTHINTERNAL_AUTO_INCREMENTINTERNAL_AVG_ROW_LENGTHINTERNAL_CHECKSUMINTERNAL_CHECK_TIMEINTERNAL_DATA_FREEINTERNAL_DATA_LENGTHINTERNAL_DD_CHAR_LENGTHINTERNAL_GET_COMMENT_OR_ERRORINTERNAL_GET_ENABLED_ROLE_JSONINTERNAL_GET_HOSTNAMEINTERNAL_GET_USERNAMEINTERNAL_GET_VIEW_WARNING_OR_ERRORINTERNAL_INDEX_COLUMN_CARDINALITYINTERNAL_INDEX_LENGTHINTERNAL_IS_ENABLED_ROLEINTERNAL_IS_MANDATORY_ROLEINTERNAL_KEYS_DISABLEDINTERNAL_MAX_DATA_LENGTHINTERNAL_TABLE_ROWSINTERNAL_UPDATE_TIMEIS_VISIBLE_DD_OBJECTLocking FunctionsGET_LOCKIS_FREE_LOCKIS_USED_LOCKRELEASE_ALL_LOCKSRELEASE_LOCKLogical Operators!ANDASSIGN-EQUALASSIGN-VALUEORXORMiscellaneous FunctionsANY_VALUEBIN_TO_UUIDDEFAULTGROUPINGINET6_ATONINET6_NTOAINET_ATONINET_NTOAIS_IPV4IS_IPV4_COMPATIS_IPV4_MAPPEDIS_IPV6IS_UUIDMASTER_POS_WAITNAME_CONSTSLEEPSOURCE_POS_WAITUUIDUUID_SHORTUUID_TO_BINVALUESNumeric Functions%*+- BINARY- UNARY/ABSACOSASINATANATAN2CEILCEILINGCONVCOSCOTCRC32DEGREESDIVEXPFLOORLNLOGLOG10LOG2MODPIPOWPOWERRADIANSRANDROUNDSIGNSINSQRTTANTRUNCATEPerformance Schema FunctionsFORMAT_BYTESFORMAT_PICO_TIMEPS_CURRENT_THREAD_IDPS_THREAD_IDSpatial FunctionsGeometry ConstructorsGEOMCOLLECTIONGEOMETRYCOLLECTIONLINESTRINGMULTILINESTRINGMULTIPOINTMULTIPOLYGONPOINTPOLYGONGeometry Property FunctionsST_DIMENSIONST_ENVELOPEST_GEOMETRYTYPEST_ISEMPTYST_ISSIMPLEST_SRIDGeometry Relation FunctionsST_CONTAINSST_CROSSESST_DISJOINTST_DISTANCEST_EQUALSST_FRECHETDISTANCEST_HAUSDORFFDISTANCEST_INTERSECTSST_OVERLAPSST_TOUCHESST_WITHINGeometryCollection Property FunctionsST_BUFFERST_BUFFER_STRATEGYST_CONVEXHULLST_DIFFERENCEST_GEOMETRYNST_INTERSECTIONST_LINEINTERPOLATEPOINTST_LINEINTERPOLATEPOINTSST_NUMGEOMETRIESST_POINTATDISTANCEST_SYMDIFFERENCEST_TRANSFORMST_UNIONLineString Property FunctionsST_ENDPOINTST_ISCLOSEDST_LENGTHST_NUMPOINTSST_POINTNST_STARTPOINTMBR Functions->->>JSON_ARRAYJSON_ARRAY_APPENDJSON_ARRAY_INSERTJSON_CONTAINSJSON_CONTAINS_PATHJSON_DEPTHJSON_EXTRACTJSON_INSERTJSON_KEYSJSON_LENGTHJSON_MERGEJSON_MERGE_PATCH()JSON_MERGE_PRESERVE()JSON_OBJECTJSON_OVERLAPSJSON_PRETTYJSON_QUOTEJSON_REMOVEJSON_REPLACEJSON_SCHEMA_VALIDJSON_SCHEMA_VALIDATION_REPORTJSON_SEARCHJSON_SETJSON_STORAGE_FREEJSON_STORAGE_SIZEJSON_TABLEJSON_TYPEJSON_UNQUOTEJSON_VALIDJSON_VALUEMBRCONTAINSMBRCOVEREDBYMBRCOVERSMBRDISJOINTMBREQUALSMBRINTERSECTSMBROVERLAPSMBRTOUCHESMBRWITHINMEMBER OFST_ASGEOJSONST_COLLECTST_DISTANCE_SPHEREST_GEOHASHST_GEOMFROMGEOJSONST_ISVALIDST_LATFROMGEOHASHST_LONGFROMGEOHASHST_MAKEENVELOPEST_POINTFROMGEOHASHST_SIMPLIFYST_VALIDATEPoint Property FunctionsST_LATITUDEST_LONGITUDEST_XST_YPolygon Property FunctionsST_AREAST_CENTROIDST_EXTERIORRINGST_INTERIORRINGNST_NUMINTERIORRINGSWKB FunctionsST_ASBINARYST_ASTEXTST_GEOMCOLLFROMWKBST_GEOMFROMWKBST_LINEFROMWKBST_MLINEFROMWKBST_MPOINTFROMWKBST_MPOLYFROMWKBST_POINTFROMWKBST_POLYFROMWKBST_SWAPXYWKT FunctionsST_GEOMCOLLFROMTEXTST_GEOMFROMTEXTST_LINEFROMTEXTST_MLINEFROMTEXTST_MPOINTFROMTEXTST_MPOLYFROMTEXTST_POINTFROMTEXTST_POLYFROMTEXTString FunctionsASCIIBINBIT_LENGTHCHAR FUNCTIONCHARACTER_LENGTHCHAR_LENGTHCONCATCONCAT_WSELTEXPORT_SETFIELDFIND_IN_SETFORMATFROM_BASE64HEXINSERT FUNCTIONINSTRLCASELEFTLENGTHLIKELOAD_FILELOCATELOWERLPADLTRIMMAKE_SETMATCH AGAINSTMIDNOT LIKENOT REGEXPOCTOCTET_LENGTHORDPOSITIONQUOTEREGEXPREGEXP_INSTRREGEXP_LIKEREGEXP_REPLACEREGEXP_SUBSTRREPEAT FUNCTIONREPLACE FUNCTIONREVERSERIGHTRPADRTRIMSOUNDEXSOUNDS LIKESPACESTRCMPSUBSTRSUBSTRINGSUBSTRING_INDEXTO_BASE64TRIMUCASEUNHEXUPPERWEIGHT_STRINGWindow FunctionsCUME_DISTDENSE_RANKFIRST_VALUELAGLAST_VALUELEADNTH_VALUENTILEPERCENT_RANKRANKROW_NUMBERXMLEXTRACTVALUEUPDATEXMLGeographic FeaturesGEOMETRY HIERARCHYSPATIAL COLUMNSSPATIAL INDEXESMBRWKTHelp MetadataHELP_DATEHELP_VERSIONLanguage StructureFALSETRUELoadable FunctionsCREATE FUNCTION LOADABLE FUNCTIONDROP FUNCTION LOADABLE FUNCTIONPluginsPrepared StatementsDEALLOCATE PREPAREDROP PREPAREEXECUTE STATEMENTPREPAREReplication StatementsCHANGE MASTER TOCHANGE REPLICATION FILTERCHANGE REPLICATION SOURCE TOPURGE BINARY LOGSPURGE MASTER LOGSRESET MASTERRESET REPLICARESET SLAVESET SQL_LOG_BINSTART REPLICASTART SLAVESTOP REPLICASTOP SLAVEStorage EnginesTable MaintenanceANALYZE TABLECHECK TABLECHECKSUM TABLEOPTIMIZE TABLEREPAIR TABLETransactionsBEGINCOMMITLOCK INSTANCE FOR BACKUPLOCK TABLESRELEASE SAVEPOINTROLLBACKROLLBACK TO SAVEPOINTSAVEPOINTSET TRANSACTIONSTART TRANSACTIONXAUtilityDESCDESCRIBEEXPLAINHELP STATEMENTUSE多线程执行 MySQL 查询的时候会遇到 Packet sequence number wrong 错误。
Traceback (most recent call last):
File "/tmp/db.py", line 167, in _execute
rowcount = cur.execute(sql, args)
File "/usr/local/lib/python2.7/site-packages/pymysql/cursors.py", line 163, in execute
result = self._query(query)
File "/usr/local/lib/python2.7/site-packages/pymysql/cursors.py", line 321, in _query
conn.query(q)
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 505, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 724, in _read_query_result
result.read()
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 1076, in read
self._read_result_packet(first_packet)
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 1146, in _read_result_packet
self._read_rowdata_packet()
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 1180, in _read_rowdata_packet
packet = self.connection._read_packet()
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 660, in _read_packet
% (packet_number, self._next_seq_id))
InternalError: Packet sequence number wrong - got 51 expected 178
多个查询共用连接,并发查询的时候,现在的 MySQL 网络传输机制无法判断这个返回属于哪个查询。
所以每个线程应该使用不同的连接,或者在 execute 之前加一个锁。
varchar 和 text 的差异
一次数据库表结构调整,引起了我对 MySQL 字段类型 TEXT 和 VARCHAR 的思考。
bit [1 - 64]
tinyint 1
smallint 2mediumint 3int 4bigint 8
float 4 浮点(单精度)
double 8 浮点(双精度)decimal(m, d) max(m, d) + 2 定点别名 Synonyms:
integer -> intbool / boolean -> tinyint(1)dec / numeric / fixed -> decimaldouble precision / real -> doublePS: 如果开启 REAL_AS_FLOAT 模式,REAL 就变成了 FLOAT 的别名。
charvarchar
tinytext
textmediumtextlongtext
JSON MySQL 5.7 加入
binaryvarbinary
tinyblob
blobmediumbloblongblob| 类型 | 长度 | 备注 |
|---|---|---|
year |
1 | 四位数:1901 ~ 2155 两位数:00 ~ 69 (2000 ~ 2069) 70 ~ 99 (1970 ~ 1999) |
date |
3 | 1000-01-01 ~ 9999-12-31 |
time |
3 | -838:59:59.999999 ~ 838:59:59.999999 即:-34d23h ~ 34d23h |
datetime |
8 | 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.999999 |
timestamp |
4 | 1970-01-01 00:00:00 ~ 2038-01-19 11:14:07 |
varchar)表示时间,除了失去数据库这一层的数据类型保证之外,还会在时间比较运算场景下,失去索引命中可能。bigint(8 字节)表示时间,可以扩大 timestamp 时间范围,但要自己维护数据(其实还是比较好维护的)。timestamptime、datetime、timestamp,精度最大为 6,表示毫秒。比如:timestamp(6)enumsetIntegerDecimal,不要用 float,double看到新闻,Gitlab 从 12.1 版本开始将不再支持 MySQL,理由是:
TEXT 类型字段的长度限制Gitlab 支持的另一个数据库是 PostgreSQL,意思是 PostgreSQL 不存在上面的问题。
这也可以看作是二者的部分区别吧!
值得研究研究。