假设我使用
INSERT INTO database(column1)
VALUES (uuid());
如果我再次这样做
INSERT INTO database(column1)
VALUES (uuid());
(让我们假设 UUID 都是相同的,不知何故)
mysql会为它抛出错误,还是等到创建不存在的UUID?
使用 UUIDv4(在 PHP 中)
我对用 PHP 编写查询感到困惑,我想:
1. SELECT RollNumber FROM student WHERE ProgramID= ?
2. SELECT DSID FROM datesheet WHERE CourseCode = ?
3. INSERT INTO result (DSID, RollNumber) VALUES (both queried above)
我已经尝试过使用 HTML 动态表,但仍然无法获得我想要的确切结果。
还尝试使用我从 stackoverflow 的帖子中看到的这段代码,但没有任何帮助。
INSERT INTO result (DSID, RollNumber)
VALUES (
( SELECT RollNumber FROM student WHERE ProgramID= ? ),
( SELECT DSID FROM datesheet WHERE CourseCode = ? )
);
我需要优化具有多个连接的查询。并且还具有多个 OR AND 条件,这些条件取决于用户输入。
生成的查询是:
SELECT emp.name as entryby, l.cname as location_name, sp.product AS product_name,
sp.refcode as pro_refcode, sup.vendorname, sp.mrpgross AS mrpgross,
pro.cp AS cost_price, cust.name AS customer_names, cust.phone AS mobile_no,
sp.uom1 as TotalQTY, sp.category_name, auth.*
FROM erp_salesorderproductsdetails sp
LEFT JOIN erp_salesorder s ON s.id = sp.salesorder_id
LEFT JOIN geopos_employees emp ON emp.id = s.entryby
LEFT JOIN geopos_locations l ON s.loc = l.id
LEFT JOIN geopos_productall pro ON pro.product_code = sp.refcode
LEFT JOIN geopos_supplier sup ON sup.id = pro.vendor
LEFT JOIN geopos_customers cust ON cust.id = s.customer
LEFT JOIN authorize_po auth ON auth.salesorder_id = s.id
WHERE sp.salesorder_id = 301
AND ( sp.category_name IN(SPECTACLES, SPECTACLE LENSES) )
OR sp.salesorder_id = 310
AND ( sp.category_name IN(SPECTACLES, SPECTACLE LENSES) )
OR sp.salesorder_id = 3234
AND (sp.category_name IN(SPECTACLES, SPECTACLE LENSES) )
在这里,sp.salesorder_id
根据用户输入,where 条件中的 AND 可以是多个。要检索大约 700 - 800 条记录,大约需要 2 到 3.5 分钟。
但大多数数据计数超过 2000。在这种情况下,它的执行效率不高。任何人都可以提出任何建议吗?
我还分享了正在生成的查询的解释结果。但是,共享表结构并不是一个好主意,因为有些表的列数超过 50。
1 SIMPLE sp ALL NULL NULL NULL NULL 6211 Using where
1 SIMPLE s eq_ref PRIMARY PRIMARY 4 erp_billing.sp.salesorder_id 1
1 SIMPLE emp eq_ref PRIMARY PRIMARY 4 erp_billing.s.entryby 1 Using where
1 SIMPLE l eq_ref PRIMARY PRIMARY 4 erp_billing.s.loc 1 Using where
1 SIMPLE pro ALL NULL NULL NULL NULL 340264 Using where; Using join buffer (flat, BNL join)
1 SIMPLE sup eq_ref PRIMARY PRIMARY 4 erp_billing.pro.vendor 1 Using where
1 SIMPLE cust eq_ref PRIMARY PRIMARY 4 erp_billing.s.customer 1 Using where
1 SIMPLE auth ALL NULL NULL NULL NULL 13 Using where; Using join buffer (flat, BNL join)
我有两台服务器:
在服务器 A 上,尽管它更小,但数据库运行良好,事务非常快,并发用户超过 200 个。
在更大的服务器 B 上,这发生在我身上:最多 50 个并发用户不是问题,并且数据库运行良好,但是在用户数量超过 50 之后,数据库开始变慢。
两台服务器都有相同的数据库、相同的表、相同的存储过程、相同的应用程序,实际上它们是彼此的副本。
我怎样才能找出问题出在哪里?
这是配置文件:
[client]
pipe=
socket=MYSQL
port=3306
[mysql] no-beep
default-character-set=
server_type=1
[mysqld]
port=3306
datadir=E:/ProgramData/MySQL/MySQL Server 8.0\Data
character-set-server=
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
log-output=FILE
general-log=0
general_log_file="NS31525947.log"
slow-query-log=1
slow_query_log_file="NS31525947-slow.log"
long_query_time=10
log-error="NS31525947.err"
log-bin="NS31525947-bin"
server-id=1
lower_case_table_names=1
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads"
max_connections = 500
table_open_cache=3G
tmp_table_size=3G
thread_cache_size=100
myisam_max_sort_file_size=10G
myisam_sort_buffer_size=68G
key_buffer_size=61M
read_buffer_size=23M
read_rnd_buffer_size=256K
innodb_flush_log_at_trx_commit=0
innodb_log_buffer_size=512M
innodb_buffer_pool_size=10G
innodb_log_file_size=1G
innodb_thread_concurrency=0
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
back_log=80
flush_time=0
join_buffer_size=256K
max_allowed_packet=4M
max_connect_errors=100
open_files_limit=10000
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
sync_relay_log=10000
sync_relay_log_info=10000
loose_mysqlx_port=33060
default_authentication_plugin = mysql_native_password
我还尝试将my.ini
来自服务器 A 的服务器 B 放在服务器 B 上,但没有任何改变。
我输入了数据库状态引用 现在
我知道我不应该在每一列上都有一个索引,但我不知道为什么。费用是多少?
我有一个包含大约 400 个表的系统,其中许多表都有日期时间或外键(实际上可能没有外键规则,因为它们并不严格),它们缺少索引。这可能会导致相对简单的查询(例如:跨 3 个具有时间条件和表的主键的表的 3 列)的大量查询时间。
运行有问题的查询的时间花了我 2 多分钟,但是一旦我在时间戳和外键上添加索引,它就会下降到 200 毫秒以下,增加了 6000%。我很想在我有指标的每一列上添加索引,但我知道(从其他人告诉我)过多的索引是不好的。但我在任何地方都找不到为什么!
所以我的问题是:什么是“太多”索引,为什么?
我正在尝试从在 Ubuntu(18.4) 系统上的 apache2 上运行的 PHP(7.4, 8.0) Laravel 连接 Sybase 17。我们正在使用 SQL Anywhere。Sybase 未安装在同一台服务器上。
我们收到此错误 - 警告:odbc_connect():SQL 错误:[unixODBC][驱动程序管理器]无法打开 lib '/opt/sqlanywhere17/lib64/libdbodbc17_r.so':找不到文件,SQLConnect 中的 SQL 状态 01000 /var/www/html/sybaseconnection.php 第 14 行
我们已经执行了以下步骤:
我需要将特定值插入到我正在使用 SQL 处理的表中(请参见下面的函数):
INSERT INTO *Table Name* (...) VALUES(...);
将要存储在此表中的值是涉及另一种编程语言的值,这些编程语言有很多奇怪的符号,包括单个反斜杠、*、美元符号等。
我怎样才能准确地插入值,因为它们在这个表中?
例如,当我键入“\2”时,它需要在表中返回 \2 而不仅仅是 2。我无法手动输入两个反斜杠来获取 \2。这是因为我通过 HTML 接收来自另一个用户的输入并使用 PHP 将其发送到我的表。我遇到的问题是正在输入的带有 SQL 的这些特殊字符并不是我打算将它们作为值的方式。
有没有办法用预先调用的某个字符串函数准确地输入这些值?其他方法将不胜感激!
数据库的附加信息:
服务器:通过 UNIX 套接字的 localhost
服务器类型:MySQL
服务器连接:未使用 SSL 文档
服务器版本:5.6.49-cll-lve - MySQL 社区服务器 (GPL)
潜在答案: $mysqli 是否定义如下?(我称之为 $db。)
$mysqli=mysqli_connect(...);
因此,该文字添加如下:
$query = "INSERT INTO Table (C1, ... Cn) VALUES('$C1', ... '$Cn')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $C1, ..., $Cn);
$stmt->execute();
mysqli_query($db, $query);
假设我对我的数据库中的一个表有大约 1000 个同时请求,该表由这些语句组成(按顺序):
SELECT
INSERT or UPDATE (could be multiple)
DELETE
我想确保没有任何请求相互干扰,并且表处于下一个传入请求的更新状态。例如:
Request #1 comes in.
Request #2 comes in.
Request #1 starts to get processed.
Request #2 should start only when Request #1 is processed so that the data view is consistent and updated for the next request.
我在网上搜索了这种情况,发现了两件事可能会有所帮助:
交易
表锁定
但是当我阅读事务时,我发现当一个事务正在处理一行时,其他事务仍然可以出现并修改该行,这违背了我的目的。
同样在锁定的情况下,只能将列锁定在一种模式下,即读取或写入模式,这再次无法保持数据一致,因为在读取行时它可能会被更新并且刚刚读取的数据将成为旧版本的表实际上是现在。
有没有一种可靠的方法来实现这一点,可以确保没有请求干扰另一个请求,并且表处于下一个传入请求的更新状态?
如果这有帮助,我正在将 MySQL 与 PHP 一起使用。