ไม่ใช่คำตอบเฉพาะ MySql แต่จะปรับปรุงประสิทธิภาพของคำสั่ง sql ของคุณ
สิ่งที่คุณทำอย่างมีประสิทธิภาพคือการคำนวณระยะทางทุกจุดในตารางเพื่อดูว่าอยู่ในระยะ 10 หน่วยของจุดที่กำหนดหรือไม่
สิ่งที่คุณสามารถทำได้ก่อนที่คุณจะเรียกใช้ sql นี้คือการสร้างสี่จุดที่วาดกล่อง 20 หน่วยด้านข้างโดยมีจุดอยู่ตรงกลางเช่น (x1, y1) . . (x4, y4) โดยที่ (x1, y1) คือ (ที่ให้ยาว + 10 หน่วย, รับไปยัง Lat + 10 หน่วย) . . (ที่ได้รับยาว - 10 หน่วย, ที่ได้รับแลต -10 หน่วย)
ที่จริงแล้วคุณต้องการเพียงสองจุดด้านบนซ้ายและล่างขวาเรียกพวกเขา (X1, Y1) และ (X2, Y2)
ตอนนี้คำสั่ง SQL ของคุณใช้จุดเหล่านี้เพื่อแยกแถวที่แน่นอนมากกว่า 10u จากจุดที่คุณกำหนดไว้มันสามารถใช้ดัชนีบนละติจูดและลองจิจูดดังนั้นจะเป็นคำสั่งของขนาดเร็วกว่าสิ่งที่คุณมีอยู่ในปัจจุบัน
เช่น
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
กล่องวิธีสามารถส่งกลับค่าบวกเท็จ (คุณสามารถรับคะแนนในมุมของกล่องที่> 10u จากจุดที่กำหนด) ดังนั้นคุณยังต้องคำนวณระยะทางของแต่ละจุด อย่างไรก็ตามสิ่งนี้จะเร็วขึ้นอีกมากเพราะคุณได้ จำกัด จำนวนคะแนนที่จะทดสอบกับจุดภายในกล่องอย่างมาก
ฉันเรียกเทคนิคนี้ว่า "การคิดภายในกล่อง" :)
แก้ไข:สิ่งนี้สามารถใส่ลงในคำสั่ง SQL เดียว?
ฉันไม่รู้ว่า mySql หรือ Php สามารถขอโทษได้อย่างไร ฉันไม่รู้ว่าที่ที่ดีที่สุดคือการสร้างจุดสี่จุดหรือวิธีที่พวกเขาสามารถส่งผ่านไปยังแบบสอบถาม mySql ใน Php ได้ อย่างไรก็ตามเมื่อคุณมีสี่คะแนนไม่มีอะไรหยุดคุณรวมคำสั่ง SQL ของคุณเองกับของฉัน
select name,
( 3959 * acos( cos( radians(42.290763) )
* cos( radians( locations.lat ) )
* cos( radians( locations.lng ) - radians(-71.35368) )
+ sin( radians(42.290763) )
* sin( radians( locations.lat ) ) ) ) AS distance
from locations
where active = 1
and locations.lat between X1 and X2
and locations.Long between y1 and y2
having distance < 10 ORDER BY distance;
ฉันรู้ด้วย MS SQL ฉันสามารถสร้างคำสั่ง SQL ที่ประกาศสี่โฟลท (X1, Y1, X2, Y2) และคำนวณพวกมันก่อนคำสั่งเลือก "หลัก" อย่างที่ฉันพูดฉันไม่รู้ว่ามันสามารถทำได้ด้วย MySql อย่างไรก็ตามฉันยังคงต้องการสร้างจุดสี่จุดใน C # และส่งผ่านเป็นพารามิเตอร์ไปยังแบบสอบถาม SQL
ขออภัยฉันไม่สามารถช่วยเหลือเพิ่มเติมได้ถ้าใครสามารถตอบ MySQL & Php บางส่วนได้โปรดแก้ไขคำตอบนี้ได้